您好我正在比较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]数组。
答案 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:
因此,使用0标志时,未偏置的Matlab实现与Apache版本完全相同,当你减去3以使其成为过度的峰度时。
(kurtosis(x,0)-3)-kurt.evaluate(x)
ans = 3.8636e-14