比较Matlab和Apache统计数据 - 峰度

时间:2014-04-22 11:34:10

标签: apache matlab statistics kurtosis

您好我正在比较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是一个双[n x m]数组。

1 个答案:

答案 0 :(得分:3)

您也可以通过导入函数来计算Matlab中的Apache Java统计信息。 Apache函数使用population excess kurtosis的无偏估计。 Excess峰度意味着减去3,使正态分布的峰度等于零。

为了演示它我还从函数(Apache documentation)中创建了一个Matlab函数:

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)

ans = 0.0016

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

ans = 0.0016

kurtosis(x)

ans = 3.0010

kurtosis(x,0)

ans = 3.0016

还请注意Matlab Kurtosis documentation

Matlab documentation

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

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

ans = 3.8636e-14