Сравнение статистики 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:
Таким образом, с флагом 0 несмещенная реализация Matlab точно такая же, как и версия Apache, когда вы вычтете 3, чтобы сделать его избыточным эксцессом.
(kurtosis(x,0)-3)-kurt.evaluate(x)
ans = 3.8636e-14