2

您好我目前正在比较 Matlab 和 Apache 函数之间的统计数据。这里 Apache 函数在 Java 中进行了测试。对于相同的数据集,我从双精度数组(double[])中得到不同的结果,如下所示:

---------------------------------------
           Matlab       vs Apache
---------------------------------------
max      = 0.5451       vs 0.5450980392156862
min      = 0.4941       vs 0.49411764705882355
var      = 5.4154e-05   vs 5.415357603461868E-5
std      = 0.0074       vs 0.007358911334879547
mean     = 0.5206       vs 0.5205525290240967
kurtosis = 3.3442       vs 0.35227427833465486
skewness = 0.2643       vs 0.26466432504210746

我检查并重新检查了我的数据,Matlabs 中的每个值都与 Java 中使用的相同。在这里,我们可以看到所有统计数据都是相同的,除了峰度。

峰度的计算是否可能与 Matlab 和 Apache 库不同?如果是这样,那么我应该信任哪些数据?


编辑

我的数据是图像矩阵的子集(包含像素值)。对于每个子集,我计算上述统计数据。每次,除了峰度之外,所有统计数据都完美匹配。

用于计算我的子集峰度的 matlab 代码如下:

kurtosis( sub(:) ); // sub is a n x m matrix

虽然我在 Java 中使用的是:

import org.apache.commons.math3.stat.descriptive.moment.Kurtosis;
// ...
Kurtosis kurt = new Kurtosis();
System.out.println("-kurtosis: " + kurt.evaluate(subImg) );

subImg 是一个 double[nxm] 数组。

4

1 回答 1

3

您也可以通过导入函数在 Matlab 中计算 Apache Java 统计信息。Apache 函数使用人口过剩峰度的无偏估计。过度峰度意味着减去 3 使得正态分布的峰度等于 0。

为了演示它,我还从函数中制作了一个 Matlab 函数(Apache 文档):

function y = kurtosis_apache(x)

    n=length(x);
    mean_x = mean(x);
    std_x = std(x);

    y = ( (n*(n+1) / ((n -1)*(n - 2)*(n-3))) * sum((x - mean_x).^4) / std_x.^4 ) - ((3*(n-1).^2) / ((n-2)*(n-3)));
end

我在命令窗口中的代码显示了 Matlab Apache 实现、Java Apache 实现和 Matlab 版本(有偏/无偏):

javaaddpath('commons-math3-3.2.jar')
import org.apache.commons.math3.stat.descriptive.moment.Kurtosis;

x = randn(1e4,1);

kurtosis_apache(x)

答案 = 0.0016

kurt = Kurtosis();
kurt.evaluate(x)

答案 = 0.0016

kurtosis(x)

答案 = 3.0010

kurtosis(x,0)

答案 = 3.0016

另请注意Matlab Kurtosis 文档

Matlab 文档

因此,使用 0 标志,无偏的 Matlab 实现与 Apache 版本完全相同,当您减去 3 使其成为过度峰度时。

(kurtosis(x,0)-3)-kurt.evaluate(x)

答案 = 3.8636e-14

于 2014-04-23T08:31:01.627 回答