Come faccio a calcolare la deviazione standard di python senza l'utilizzo di numpy?

0

Domanda

Sto cercando di calcolare la deviazione standard di python senza l'utilizzo di numpy o qualsiasi libreria esterna tranne che per math. Voglio arrivare meglio a scrivere algoritmi e sto facendo questo come un po ' di "compiti a casa" come migliorare il mio python competenze. Il mio obiettivo è quello di tradurre questa formula in python, ma non sono sempre il risultato corretto.

Sto usando un array di velocità in cui speeds = [86,87,88,86,87,85,86]

Quando ho eseguito:

std_dev = numpy.std(speeds)
print(std_dev)

Ricevo: 0.903507902905. Ma non voglio fare affidamento su di numpy. Quindi...

La mia implementazione è il seguente:

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):
    # get mu
    mean = get_mean(array)
    # (x[i] - mu)**2
    for i in array:
        array = (i - mean) ** 2
        return array
    sum_sqr_diff = 0
    # get sigma
    for i in array:
        sum_sqr_diff = sum_sqr_diff + i
        return sum_sqr_diff
    # get mean of squared differences
    variance = 1/len(array)
    mean_sqr_diff = (variance * sum_sqr_diff)
    
    std_dev = math.sqrt(mean_sqr_diff)
    return std_dev

std_dev = get_std_dev(speeds)
print(std_dev)

Ora, quando ho eseguito:

std_dev = get_std_dev(speeds)
print(std_dev)

Ottengo: [0] ma sono in attesa di ricevere 0.903507902905

Quello che mi manca qui?

algorithm mean python standard-deviation
2021-11-23 20:46:59
5

Migliore risposta

1
speeds = [86,87,88,86,87,85,86]

# Calculate the mean of the values in your list
mean_speeds = sum(speeds) / len(speeds)

# Calculate the variance of the values in your list
# This is 1/N * sum((x - mean(X))^2)
var_speeds = sum((x - mean_speeds) ** 2 for x in speeds) / len(speeds)

# Take the square root of variance to get standard deviation
sd_speeds = var_speeds ** 0.5

>>> sd_speeds
0.9035079029052513
2021-11-23 21:10:27

Quando corro che ho 1.0.
bkleeman

Riavviare il python kernel. Qualcosa che hai fatto è avvitato con una delle funzioni built-in.
CJR

Oh, non importa, si sta utilizzando python2.7, arent voi. Aggiungere from __future__ import division - la divisione standard / non è vero, divisione fino python 3.0, a meno che si importa dal futuro.
CJR

sì sto usando 2.7. La soluzione più futuro divisione di importazione è lavoro per me, ora. La ringrazio molto per l'aiuto!
bkleeman

E ' il momento di passare alla py3, mate.
CJR

Io sono abbastanza nuovo di python e non ho ancora capito la rima o ragione da quando la mia macchina corre py2 vs py3 ad essere onesti. Dovrò avere che risolto.
bkleeman

Un sacco di distribuzioni linux nave con py2.7 e py3 - probabilmente avete python3 (ma il binario è python3 invece di python). Si può anche considerare l'utilizzo di qualcosa come anaconda per impostare ambienti. py2.7 è ben oltre la fine del ciclo di vita.
CJR
1

Il problema nel tuo codice è il riutilizzo di array e ritorno a metà del ciclo

def get_std_dev(array):
    # get mu
    mean = get_mean(array)       <-- this is 86.4
    # (x[i] - mu)**2
    for i in array:
        array = (i - mean) ** 2  <-- this is almost 0
        return array             <-- this is the value returned

Vediamo ora l'algoritmo utilizzato. Nota che ci sono due deviazione std formule che sono comunemente usati. Ci sono diverse motivazioni per cui uno è corretto.

sqrt(sum((x - mean)^2) / n)

o

sqrt(sum((x - mean)^2) / (n -1))

Per grandi valori di n, la prima formula è utilizzata dato che -1 è insignificante. La prima formula può essere ridotto a

sqrt(sum(x^2) /n - mean^2)

Così come si potrebbe fare questo in python?

def std_dev1(array):
   n = len(array)
   mean = sum(array) / n
   sumsq = sum(v * v for v in array)
   return (sumsq / n - mean * mean) ** 0.5
2021-11-24 06:21:59
-1

alcuni problemi di codice, uno di loro è il valore di ritorno all'interno l'istruzione for. si può provare questo

def get_mean(array):
    return sum(array) / len(array)


def get_std_dev(array):
    n = len(array)
    mean = get_mean(array)
    squares_arr = []
    for item in array:
        squares_arr.append((item - mean) ** 2)
    return math.sqrt(sum(squares_arr) / n)
2021-11-23 22:06:23
-2

Questo. È necessario sbarazzarsi di return all'interno del loop.

def get_std_dev(array):
    # get mu
    mean = get_mean(array)
    sum_sqr_diff = 0
    # get sigma
    for i in array:
        sum_sqr_diff = sum_sqr_diff + (i - mean)**2
    # get mean of squared differences
    variance = 1/len(array)
    mean_sqr_diff = (variance * sum_sqr_diff)
    
    std_dev = math.sqrt(mean_sqr_diff)
    return std_dev
2021-11-23 20:59:12
-2

Se non si desidera utilizzare numpy il suo ok, dare una prova di statistics pacchetto python

import statistics

st_dev = statistics.pstdev(speeds)
print(st_dev)

o se siete ancora disposti a utilizzare una soluzione personalizzata, quindi vi consiglio di utilizzare il seguente modo, utilizzando le list comprehension invece del complesso buggy approccio

import math

mean = sum(speeds) / len(speeds)
var = sum((l-mean)**2 for l in speeds) / len(speeds)
st_dev = math.sqrt(var)
print(st_dev)
2021-11-23 20:58:42

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................