Cum pot calcula abaterea standard în python, fără a utiliza numpy?

0

Problema

Am încercat pentru a calcula abaterea standard în python, fără utilizarea de numpy sau orice externe de bibliotecă, cu excepția math. Vreau să ajung mai bine la scris algoritmi și fac asta ca un pic de "temele", ca să-mi îmbunătățesc aptitudinile de python. Scopul meu este de a traduce această formulă în python, dar nu sunt obtinerea de rezultatul corect.

Eu sunt, folosind o gamă largă de viteze de unde speeds = [86,87,88,86,87,85,86]

Atunci când am rula:

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

Am înțeles: 0.903507902905. Dar nu vreau să se bazeze pe numpy. Deci...

Punerea în aplicare este după cum urmează:

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)

Acum, când am rula:

std_dev = get_std_dev(speeds)
print(std_dev)

Am primi: [0] dar aștept 0.903507902905

Ce am pierdut pe aici?

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

Cel mai bun răspuns

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

Când am alerga ca am 1.0.
bkleeman

Reporniți python kernel. Ceva ce ai făcut tu a tras-o cu una dintre built-in functii.
CJR

Oh, nu contează, utilizați python2.7, nu-i așa. Adauga from __future__ import division - divizia standard / nu este adevărat divizie până python 3.0 dacă nu importa din viitor.
CJR

da, eu sunt, folosind 2.7. Soluția plus viitor divizia de import este de lucru pentru mine acum. Vă mulțumesc foarte mult pentru ajutor!
bkleeman

E timpul pentru a trece la py3, amice.
CJR

Sunt destul de nou pentru python și încă nu mi-am dat seama de rimă sau un motiv ca să atunci când aparatul meu ruleaza py2 vs py3 să fiu sincer. Trebuie să o rezolv.
bkleeman

O multime de distributii linux nava cu py2.7 și py3 - probabil ai python3 (dar binar este python3 în loc de doar python). Puteți, de asemenea, ia în considerare folosind ceva de genul "anaconda" pentru a configura medii. py2.7 este trecut end-of-life.
CJR
1

Problema în codul tău este reutilizarea de matrice și de a reveni în mijlocul buclei

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

Acum, să ne uităm la algoritmul pe care îl utilizați. Rețineți că există două abatere std formule, care sunt frecvent utilizate. Există diferite argumente care unul este corect.

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

sau

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

Pentru valori mari ale lui n, prima formulă este folosită de la -1 este nesemnificativă. Prima formulă poate fi redus la

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

Așa cum ați face acest lucru în 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

unele probleme în cod, una dintre ele este valoarea returnată în interiorul pentru declarație. puteți încerca acest lucru

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

Acest lucru. Ai nevoie pentru a scăpa de return în interiorul pentru bucle.

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

Dacă nu doriți să utilizați numpy ok da un încerca să statistics pachet python

import statistics

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

sau, dacă sunteți încă dispuși să folosească o soluție personalizată, atunci vă recomand să folosiți următoarea mod, folosind lista de înțelegere în loc de complex buggy abordare

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

În alte limbi

Această pagină este în alte limbi

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