La función NumPy np.std
toma un parámetro opcional ddof
: "Delta grados de libertad". Por defecto, esto es 0
. Configúrelo en 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 (de la cual la desviación estándar es la raíz cuadrada), generalmente dividimos por el número 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 este problema, podemos reducir el número por el que dividimos ( los grados de libertad ) a un número menor que N
(normalmente N-1
). El ddof
parámetro nos permite cambiar el divisor por la cantidad que especifiquemos.
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 la distribución completa (y no con un subconjunto de valores que se han elegido al azar de una distribución más grande). Si se proporciona el ddof
parámetro, NumPy divide por N - ddof
.
El comportamiento predeterminado de MATLAB std
es corregir el sesgo de la varianza de la muestra dividiendo por N-1
. Esto elimina parte (pero probablemente no todo) del sesgo en 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.
std([1 3 4 6],1)
es equivalente al valor predeterminado de NumPynp.std([1,3,4,6])
. Todo esto se explica con bastante claridad en la documentación de Matlab y NumPy, por lo que recomiendo encarecidamente que el OP se asegure de leerlos en el futuro.La desviación estándar es la raíz cuadrada de la varianza. La varianza de una variable aleatoria
X
se define comoPor tanto, un estimador de la varianza sería
donde denota la media muestral. Para la selección aleatoria , 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, tendrá que utilizar un estimador corregido (insesgado)
que convergerá a . El término de corrección también se denomina corrección de Bessel.
Ahora, de forma predeterminada, MATLABs
std
calcula el estimador insesgado con el término de correcciónn-1
. Sin embargo, NumPy (como explicó @ajcr) calcula el estimador sesgado sin término de corrección por defecto. El parámetroddof
permite establecer cualquier término de correcciónn-ddof
. Al establecerlo en 1, obtiene 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ónn-1
(estimador insesgado), mientras que paraw=1
, solo se utiliza n como término de corrección (estimador sesgado).fuente
n
ir en la parte superior de la notación de suma, entró en la suma.Para las personas que no son buenas con las estadísticas, una guía simplista es:
Incluya
ddof=1
si está calculandonp.std()
una muestra tomada de su conjunto de datos completo.Asegúrese de
ddof=0
que está calculandonp.std()
para la población completaEl DDOF se incluye para las muestras con el fin de contrarrestar el sesgo que puede ocurrir en los números.
fuente