Comparaison des statistiques Matlab et Apache – kurtosis

Bonjour, je compare actuellement les statistiques entre les fonctions Matlab et Apache. Ici, les fonctions Apache sont testées en Java. Pour le même dataset, j’obtiens des résultats différents à partir d’un tableau double (double []) comme suit:

--------------------------------------- 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 

J’ai vérifié et revérifié mes données, chaque valeur de Matlabs est la même que celle utilisée en Java. Ici, nous pouvons voir que toutes les statistiques sont identiques, sauf pour le kurtosis.

Est-ce possible que kurtosis soit calculé différemment de la bibliothèque Matlab et Apache? Si oui, quelles données devrais-je faire confiance alors?


MODIFIER

Mes données sont un sous-ensemble d’une masortingce d’image (contenant des valeurs de pixels). Pour chaque sous-ensemble, je calcule les statistiques ci-dessus. A chaque fois, toutes les statistiques correspondent parfaitement sauf pour la kurtosis.

Le code matlab pour calculer le kurtosis de mon sous-ensemble est le suivant:

 kurtosis( sub(:) ); // sub is anxm masortingx 

Alors que celui que j’ai utilisé en Java est:

 import org.apache.commons.math3.stat.descriptive.moment.Kurtosis; // ... Kurtosis kurt = new Kurtosis(); System.out.println("-kurtosis: " + kurt.evaluate(subImg) ); 

subImg étant un tableau double [nxm].

Vous pouvez également calculer les statistiques Java Apache dans Matlab en important la fonction. La fonction Apache utilise un estimateur non biaisé de la population en excès de kurtosis . L’excès de kurtosis signifie la soustraction de 3 pour que la kurtosis d’une dissortingbution normale soit égale à zéro.

Pour le démontrer, j’ai également créé une fonction Matlab hors de la fonction ( documentation 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 

Et mon code dans la fenêtre de commande qui montre l’implémentation de Matlab Apache, l’implémentation de Java Apache et la version de Matlab (biassed / unbiassed):

 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

Notez également la documentation Matlab Kurtosis :

Documentation Matlab

Ainsi, avec l’indicateur 0, l’implémentation Matlab non évaluée est exactement la même que la version Apache, lorsque vous soustrayez 3 pour en faire un kurtosis excédentaire.

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

ans = 3.8636e-14