3

有一个数据集(仅用于测试)如下: 0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5 我想通过 bin(步长)获得最小 0.1 和最大 1.5 之间的频率计数为 0.1。我在 Matlab、Octave、Origin 和 AWK 脚本中进行了测试。但是,我得到了完全不同的结果。

1. MATLAB

data  = [0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5];
edge  = 0.1:0.1:1.5;
count = histc(data, edge);

结果是:

count = [2 4 0 2 2 0 0 0 0 0 1 1 1 1 1]

2.八度

data  = [0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5];
edge  = 0.1:0.1:1.5;
count = histc(data, edge);

结果是:

count = [2 2 2 2 2 0 0 0 0 0 1 2 0 1 1]

3. 产地

使用命令“频率计数”,设置min=0.1, max=1.5,step size=0.1.

结果是:

count = [2 4 0 2 2 0 0 0 0 0 2 1 1 1]

4. AWK

{...;count[data/0.1]++;} ...

结果是:

count = [2 4 0 2 2 0 0 0 0 0 2 0 2 0 1]

为什么我会得到这些不同的结果?我做错了什么,还是我误解了“频率计数”的概念?我认为上述任何结果都不正确...您能告诉我该怎么办吗?

4

1 回答 1

5

一个快速的方法是将边缘移动

MATLAB:

data  = [0.1 0.2 0.3 0.4 0.5 1.1 1.2 1.3 1.4 1.5 0.1 0.2 0.3 0.4 0.5];
edge  = 0.05:0.1:1.55;
count = histc(data, edge)

结果:

  Columns 1 through 9

     2     2     2     2     2     0     0     0     0

  Columns 10 through 16

     0     1     1     1     1     1     0

注意:最后有一个虚假的峰值长度(边缘)=长度(数据)+1。

然后正如 Paul R 所建议的,它归结为精度和舍入。您必须进入每个频率计数功能以查看每种语言如何解释它。如果我是你,我会将所有内容乘以 10 并将它们设为整数。

data=int8(data.*10)
edge  = 1:15;
count = histc(data, edge)

结果:

  Columns 1 through 9

     2     2     2     2     2     0     0     0     0

  Columns 10 through 15

     0     1     1     1     1     1

重要的是人类如何解释它,而不是机器。如果您知道您乘以 10 ^(您的精度)并将它们设为整数,那么您并不关心机器的实际功能。然后,如果您的数据中有无理数并且仍然看到错误,请检查浮点数的编码方式 (http://en.wikipedia.org/wiki/Floating_point)

干杯。

于 2012-12-06T16:48:12.503 回答