为什么在Matlab、Octave、Origin和awk中使用相同的数据集进行频率统计会得到完全不同的结果?

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。 我想要得到最小值为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. Octave

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.1max=1.5步长=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]

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

2
我的Octave(3.6.2)输出:2 4 0 2 2 0 0 0 0 0 2 1 1 0 1 - Paul R
另一个不同的输出...为什么? - Dong
1
你所有的值都在二进制边界上,所以这可能只是浮点精度/舍入问题。 - Paul R
尝试稍微改变边缘 edge - 1e-10,看看会发生什么。同时在末尾添加一个更多的箱子。 - R. Schifini
我得到了另一个不同的结果(Octave 3.6.2)2 4 0 2 2 0 0 0 0 0 2 0 2 0 1(这与您使用的原始数据相同)。 - carandraug
显示剩余4条评论
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

注意:由于长度(edge) = 长度(data)+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)。
干杯。

不用谢。如果这对你有帮助,请把它标记为答案 ;)。 - hyamanieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接