es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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í?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay un par de errores en tu implementación.

    En primer lugar, en tu función get_std_dev, las líneas:

    for i in array:
        array = (i - mean) ** 2
        return array
    

    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 como 1/len(array), pero en realidad necesitas sumar las diferencias al cuadrado y dividir por (n-1) (donde n es la longitud del array) para obtener la varianza de la muestra, o por n 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:

    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)
        sum_sqr_diff = 0
        # Obtener sigma
        for i in array:
            sum_sqr_diff = sum_sqr_diff + (i - mean)**2
        # Obtener la media de las diferencias al cuadrado
        variance = sum_sqr_diff / (len(array) - 1)
    
        std_dev = math.sqrt(variance)
        return std_dev
    
    std_dev = get_std_dev(speeds)
    print(std_dev)
    

    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).

Comments are closed.