【问题标题】:Comparing Matlab and Apache statistics - kurtosis比较 Matlab 和 Apache 统计数据 - 峰度
【发布时间】:2014-04-22 11:34:09
【问题描述】:

您好,我目前正在比较 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[n x m] 数组。

【问题讨论】:

    标签: apache matlab statistics kurtosis


    【解决方案1】:

    您也可以通过导入函数在 Matlab 中计算 Apache Java 统计信息。 Apache 函数使用population excess kurtosis 的无偏估计器。 Excess kurtosis 表示减去3,使得正态分布的峰度等于0。

    为了演示它,我还用函数 (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

    【讨论】:

    • 您好,感谢您的回复!你把它放在一个我真正理解的东西的方式!至少我想我明白了。所以我想澄清一下。我将值放在数组 x 中。在 matlab 中:峰度(x,0)-3 = 4.9969。使用 Apache:kurtosis.evaluate(x) = 4.99689 这是一致的。所以如果我想在Java中得到matlab kurtosis(x, 1),我只需要幼稚地操作matlab k0方程,这导致:double k1 = 1/(n-1) * [ ( (kurtosis.evaluate(x ) * (n-2) * (n-3) )/(n-1) ) + 3*(n-1) ] 但是我发现 k1=4.87 而 matlab 峰度(x, 1) = 3.24。我的错误在哪里我很困惑..
    • 如果我把方程中的值 3 ( (kurtosis.evaluate(x)-3) ... ) 放回,那么我得到 k1=3.7488,这对于你向我解释的内容更接近但不合逻辑.. 供参考:x = [12 3433 54 34 6];
    • 试试 n=length(x); k0=kurt.evaluate(x)+3; k1 = (6*k0 + 9*n - 5*k0*n + k0*n^2 - 15)/(n^2 - 1)
    • 我试过了。结果与matlab数据完美匹配,非常感谢!您是在哪里/如何找到这个公式的?
    • 我有点懒:syms k0 k1 n,solve('k0==((n - 1)*(k1*(n + 1) - 3*n + 3))/( (n - 2)*(n - 3)) + 3',k1)
    猜你喜欢
    • 2013-03-28
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多