NumPy Perzentil-Funktion unterscheidet sich von der Perzentil-Funktion von MATLAB

8

Wenn ich versuche, das 75. Perzentil in MATLAB zu berechnen, bekomme ich einen anderen Wert als in NumPy.

MATLAB:

%Vor%

Python + NumPy:

%Vor%

Ich habe die Antwort auch mit R überprüft, und ich bekomme NumPys Antwort.

R:

%Vor%

Was ist hier los? Und gibt es eine Möglichkeit, Python & amp; Rs Verhalten spiegelt MATLAB's?

    
James 15.07.2014, 17:56
quelle

2 Antworten

8

MATLAB verwendet standardmäßig die Mittelpunktinterpolation. NumPy und R verwenden standardmäßig lineare Interpolation:

%Vor%

Wenn Sie den Unterschied zwischen linear und midpoint verstehen, betrachten Sie dieses einfache Beispiel:

%Vor%

Um die neueste Version von NumPy (mit Ubuntu) zu kompilieren:

%Vor%

Der Vorteil der Verwendung von git anstelle von pip ist, dass es super einfach ist, auf andere Versionen von NumPy zu upgraden (oder downzugraden) (und Sie erhalten auch den Quellcode):

%Vor%     
unutbu 15.07.2014, 18:06
quelle
2

Da die angenommene Antwort selbst nach @ cpuliks Kommentar noch unvollständig ist, poste ich hier, was hoffentlich eine vollständigere Antwort ist (obwohl aus Gründen der Kürze nicht perfekt, siehe unten).

Die Verwendung von np.percentile (x, p, interpolation = 'Mittelpunkt') wird nur für sehr spezifische Werte die gleiche Antwort liefern, nämlich wenn p / 100 ein Vielfaches von 1 / n ist, wobei n die Anzahl der Elemente ist des Arrays. In der ursprünglichen Frage war dies in der Tat der Fall, da n = 20 und p = 75, aber im Allgemeinen unterscheiden sich die beiden Funktionen.

Eine kurze Emulation der Matlab-Funktion ist gegeben durch:

%Vor%

Diese Funktion gibt, wie die von Matlab, eine stückweise lineare Ausgabe von min (x) bis max (x). Numpys Perzentilfunktion mit Interpolation = Mittelpunkt gibt eine stückweise konstante -Funktion zwischen dem Durchschnitt der beiden kleinsten Elemente und dem Durchschnitt der beiden größten zurück. Die Darstellung der beiden Funktionen für das Array in der ursprünglichen Frage ergibt das Bild in diesem Link (kann leider nicht eingebettet werden) ). Die gestrichelte rote Linie markiert das 75% Perzentil, wobei die beiden Funktionen tatsächlich zusammenfallen.

P.S. Der Grund, warum diese Funktion nicht wirklich Matlabs entspricht, ist, dass sie nur ein eindimensionales x akzeptiert, was zu Fehlern bei höherdimensionalen Dingen führt. Matlab hingegen akzeptiert ein höheres Dim-X und arbeitet auf der ersten (nicht trivialen) Dimension, aber die korrekte Implementierung würde wahrscheinlich etwas länger dauern. Sowohl diese als auch die Matlab-Funktion sollten jedoch korrekt mit höheren dimensionalen Eingaben für p / q arbeiten (dank der Verwendung von np.interp, die sich darum kümmert).

    
Marco Spinaci 03.01.2017 14:44
quelle

Tags und Links