matriz - python desvio estandar
Python: error de desviación estándar Numpy (3)
Cuando ingrese a NumPy desde Matlab, probablemente querrá tener los documentos a la mano. Son similares pero a menudo difieren en detalles pequeños pero importantes. Básicamente, calculan la desviación estándar de manera diferente. Recomiendo encarecidamente consultar la documentación para cualquier cosa que use que calcule la desviación estándar, ya sea una calculadora de bolsillo o un lenguaje de programación, ya que el valor predeterminado no está (¡lo siento!) Estandarizado.
Numpy STD: http://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html
Matlab STD: http://www.mathworks.com/help/matlab/ref/std.html
Los documentos de Numpy para std
son un poco opacos, IMHO, especialmente teniendo en cuenta que los documentos de NumPy son generalmente bastante claros. Si lees lo suficientemente lejos: la The average squared deviation is normally calculated as x.sum() / N, where N = len(x). If, however, ddof is specified, the divisor N - ddof is used instead. In standard statistical practice, ddof=1 provides an unbiased estimator of the variance of the infinite population.
The average squared deviation is normally calculated as x.sum() / N, where N = len(x). If, however, ddof is specified, the divisor N - ddof is used instead. In standard statistical practice, ddof=1 provides an unbiased estimator of the variance of the infinite population.
(En inglés, el valor predeterminado es pop std dev, configure ddof=1
para muestra std dev).
OTOH, los documentos de Matlab dejan en claro la diferencia que te hace tropezar:
There are two common textbook definitions for the standard deviation s of a data vector X. [equations omitted] n is the number of elements in the sample. The two forms of the equation differ only in n – 1 versus n in the divisor.
Entonces, de forma predeterminada, Matlab calcula la desviación estándar de la muestra (N-1 en el divisor, por lo que es más grande para compensar el hecho de que esta es una muestra) y Numpy calcula la desviación estándar de la población (N en el divisor). Utiliza el parámetro ddof
para cambiar al estándar de muestra, o cualquier otro denominador que desees (que va más allá de mi conocimiento de las estadísticas).
Por último, no ayuda con este problema, pero probablemente lo encuentre útil en algún momento. http://wiki.scipy.org/NumPy_for_Matlab_Users
Esta es una prueba simple
import numpy as np
data = np.array([-1,0,1])
print data.std()
>> 0.816496580928
¿No entiendo cómo se ha generado este resultado? Obviamente:
( (1^0.5 + 1^0.5 + 0^0.5)/(3-1) )^0.5 = 1
y en matlab me da std([-1,0,1]) = 1
. ¿Podría ayudarme a comprender cómo funciona numpy.std()
?
El quid de este problema es que necesita dividir entre N
(3), no N-1
(2). Como señaló Iarsmans, numpy utilizará la varianza de la población, no la varianza de la muestra.
Entonces la respuesta real es sqrt(2/3)
que es exactamente eso: 0.8164965...
Si está tratando de usar deliberadamente un valor diferente (que el valor predeterminado de 0) para los grados de libertad, use el argumento de la palabra clave ddof
con un valor positivo distinto de 0:
np.std(data, ddof=1)
... pero hacerlo aquí reintroducirá su problema original, ya que el número se dividirá por N - ddof
.
Vale la pena leer la página de ayuda de la función / método antes de sugerir que es incorrecta. El método hace exactamente lo que la cadena de documentos dice que debería hacer, se divide por 3, porque por defecto ddof
es cero. :
In [3]: numpy.std?
String form: <function std at 0x104222398>
File: /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/core/fromnumeric.py
Definition: numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=False)
Docstring:
Compute the standard deviation along the specified axis.
...
ddof : int, optional
Means Delta Degrees of Freedom. The divisor used in calculations
is ``N - ddof``, where ``N`` represents the number of elements.
By default `ddof` is zero.