standard estandar desviacion and python matlab numpy standard-deviation

python - estandar - ¿Por qué numpy std() da un resultado diferente a matlab std()?



sd python (3)

La desviación estándar es la raíz cuadrada de la varianza. La varianza de una variable aleatoria X se define como

Por lo tanto, un estimador de la varianza sería

dónde denota la media muestral. Para seleccionados al azar , se puede demostrar que este estimador no converge a la varianza real, sino a

Si selecciona muestras al azar y estima la media y la varianza de la muestra, deberá usar un estimador corregido (imparcial)

que convergerá a . El plazo de corrección También se llama corrección de Bessel.

Ahora, por defecto, MATLABs std calcula el estimador imparcial con el término de corrección n-1 . Sin embargo, NumPy (como explicó @ajcr) calcula el estimador sesgado sin término de corrección por defecto. El parámetro ddof permite establecer cualquier término de corrección n-ddof . Al establecerlo en 1 obtienes el mismo resultado que en MATLAB.

De manera similar, MATLAB permite agregar un segundo parámetro w , que especifica el "esquema de pesaje". El valor predeterminado, w=0 , da como resultado el término de corrección n-1 (estimador imparcial), mientras que para w=1 , solo n se usa como término de corrección (estimador sesgado).

Intento convertir el código de matlab a numpy y descubrí que numpy tiene un resultado diferente con la función std.

en matlab

std([1,3,4,6]) ans = 2.0817

en numpy

np.std([1,3,4,6]) 1.8027756377319946

¿Esto es normal? ¿Y cómo debo manejar esto?


La función NumPy np.std toma un parámetro opcional ddof : "Delta Degrees of Freedom". Por defecto, esto es 0 . Ajústelo a 1 para obtener el resultado de MATLAB:

>>> np.std([1,3,4,6], ddof=1) 2.0816659994661326

Para agregar un poco más de contexto, en el cálculo de la varianza (cuya desviación estándar es la raíz cuadrada), generalmente dividimos por la cantidad de valores que tenemos.

Pero si seleccionamos una muestra aleatoria de N elementos de una distribución más grande y calculamos la varianza, la división por N puede conducir a una subestimación de la varianza real. Para solucionar esto, podemos reducir el número que dividimos entre ( los grados de libertad ) a un número menor que N (generalmente N-1 ). El parámetro ddof nos permite cambiar el divisor por la cantidad que especificamos.

A menos que se indique lo contrario, NumPy calculará el estimador sesgado para la varianza ( ddof=0 , dividiendo por N ). Esto es lo que desea si está trabajando con toda la distribución (y no con un subconjunto de valores que se seleccionaron aleatoriamente de una distribución más grande). Si se ddof parámetro ddof , NumPy se divide por N - ddof en N - ddof lugar.

El comportamiento predeterminado del estándar de MATLAB es corregir el sesgo de la varianza de la muestra dividiendo por N-1 . Esto elimina algunos de los sesgos (pero probablemente no todos) de la desviación estándar. Es probable que esto sea lo que desea si está utilizando la función en una muestra aleatoria de una distribución más grande.

La buena respuesta de @hbaderts brinda más detalles matemáticos.


Para las personas que no son excelentes con las estadísticas, una guía simplista es:

  • Incluya ddof=1 si está calculando np.std() para una muestra tomada de su conjunto de datos completo.

  • Asegúrese de ddof=0 si está calculando np.std() para la población completa

El DDOF se incluye para muestras con el fin de contrarrestar el sesgo que puede ocurrir en los números.