¿Cómo calculo la desviación estándar en Python sin utilizar numpy?
Estoy tratando de calcular la desviación estándar en Python sin el uso de numpy
o cualquier biblioteca externa excepto math
. Quiero mejorar mi habilidad para escribir algoritmos y solo estoy haciendo esto como una tarea mientras mejoro mis habilidades en Python. Mi objetivo es traducir esta fórmula a Python pero no estoy obteniendo el resultado correcto.
Estoy usando una matriz de velocidades donde speeds = [86,87,88,86,87,85,86]
Cuando ejecuto:
std_dev = numpy.std(speeds)
print(std_dev)
Obtengo: 0.903507902905. Pero no quiero depender de numpy. Entonces…
Mi implementación es la siguiente:
import math
speeds = [86,87,88,86,87,85,86]
def get_mean(array):
sum = 0
for i in array:
sum = sum + i
mean = sum/len(array)
return mean
def get_std_dev(array):
# obtener mu
mean = get_mean(array)
# (x[i] - mu)**2
for i in array:
array = (i - mean) ** 2
return array
sum_sqr_diff = 0
# obtener sigma
for i in array:
sum_sqr_diff = sum_sqr_diff + i
return sum_sqr_diff
# obtener la media de las diferencias s^2
variance = 1/len(array)
mean_sqr_diff = (variance * sum_sqr_diff)
std_dev = math.sqrt(mean_sqr_diff)
return std_dev
Entonces, cuando ejecuto:
std_dev = get_std_dev(speeds)
print(std_dev)
Obtengo: [0]
pero espero 0.903507902905
¿Qué me falta aquí?
davy.ai
Hay un par de errores en tu implementación.
En primer lugar, en tu función
get_std_dev
, las líneas:deberían estar sangradas para formar parte del bucle. Tal y como está escrita actualmente, sólo está calculando el término
(x[0] - mu)**2
y devolviéndolo inmediatamente, sin calcular los otros términos.En segundo lugar, estás estableciendo
variance
como1/len(array)
, pero en realidad necesitas sumar las diferencias al cuadrado y dividir por(n-1)
(donden
es la longitud del array) para obtener la varianza de la muestra, o porn
para obtener la varianza de la población. En este caso, ya que parece que estás trabajando con una muestra, deberías usar(n-1)
en el denominador.Aquí tienes una implementación corregida:
Esto debería darte la desviación estándar correcta de
0.9035079029048962
(la pequeña diferencia con el resultado de numpy se debe a que numpy utiliza una fórmula diferente para calcular la varianza de la muestra).