Сравнение статистики Matlab и Apache - эксцесс

Привет я в настоящее время сравниваю статистику между функциями 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 ответ

Решение

Вы также можете рассчитать статистику Apache Java в Matlab, импортировав функцию. Функция Apache использует объективную оценку избыточного эксцесса населения. Избыточный эксцесс означает вычитание 3, так что эксцесс нормального распределения равен нулю.

Чтобы продемонстрировать это, я также сделал функцию 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)

ANS = 0,0016

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

ANS = 0,0016

kurtosis(x)

ans = 3.0010

kurtosis(x,0)

ans = 3.0016

Обратите также внимание на документацию Matlab Kurtosis:

Документация Matlab

Таким образом, с флагом 0 несмещенная реализация Matlab точно такая же, как и версия Apache, когда вы вычтете 3, чтобы сделать его избыточным эксцессом.

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

ans = 3.8636e-14

Другие вопросы по тегам