Ako môžem vypočítať štandardnú odchýlku v jazyku python bez pomocou numpy?

0

Otázka

Snažím sa vypočítať štandardnú odchýlku v jazyku python bez použitia numpy alebo akékoľvek iné externé knižnice s výnimkou math. Chcem získať lepšie písanie algoritmy a som len robiť to ako trochu "domáce úlohy", ako som zlepšiť moje python zručnosti. Mojím cieľom je preložiť tento vzorec do python, ale nie som dostať správny výsledok.

Ja som pomocou poľa rýchlosti, kde speeds = [86,87,88,86,87,85,86]

Keď som sa spustiť:

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

Som si: 0.903507902905. Ale nechcem sa spoliehať na numpy. Takže...

Môj vykonávanie je nasledovný:

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)

Teraz, keď som sa spustiť:

std_dev = get_std_dev(speeds)
print(std_dev)

Som si: [0] ale ja som očakával 0.903507902905

Čo mám chýba tu?

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

Najlepšiu odpoveď

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

Keď spustím, že som si 1.0.
bkleeman

Reštartujte python jadra. Niečo, čo ste urobili, má závit s jedným z vstavaných funkcií.
CJR

Ach, nevadí, používate python2.7, nie vy. Pridať from __future__ import division - štandardné rozdelenie / nie je pravda, rozdelenie, kým python 3.0, pokiaľ importujete z budúcnosti.
CJR

áno, používam 2.7. Vaše riešenie plus budúcnosti divízie import je práca pre mňa. Ďakujem vám veľmi pekne za pomoc!
bkleeman

Je čas presunúť do py3, matný.
CJR

Som celkom nový python a ja som sa ešte prišiel na nádchu alebo dôvodu, ako keď môj stroj beží py2 vs py3 byť úprimný. Budem sa musieť dostať že vyriešené.
bkleeman

Mnoho distribúcií linuxu loď s py2.7 a py3 - pravdepodobne máte python3 (ale binárny je python3 namiesto toho, aby len python). Môžete tiež zvážiť použitie niečo ako anakonda nastaviť prostredia. py2.7 je dobre minulosti end-of-life.
CJR
1

Problém v kóde je znovu použiť pole a vrátiť sa v strede slučky

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

Pozrime sa teraz pozrieť na algoritmus, ktorý používate. Všimnite si, že tam sú dve std odchýlka vzorce, ktoré sú bežne používané. Existujú rôzne dôvody, ktorý z nich je správny.

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

alebo

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

Pre veľké hodnoty n, prvý vzorec sa používa od -1 je bezvýznamné. Prvý vzorec môže byť znížená na

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

Tak ako by ste to urobiť v jazyku 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

niektoré problémy v kóde, jeden z nich sa vráti hodnotu vo vnútri pre ziskov a strát. môžete skúsiť tento

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

Toto. Potrebujete sa zbaviť return vnútri slučky.

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

Ak nechcete použiť numpy jej ok skúste dať do statistics balíkov v jazyku python

import statistics

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

alebo ak ste ešte ochotní použiť vlastné riešenie, potom odporúčam vám použiť nasledujúce spôsob, ako pomocou zoznamu s porozumením namiesto komplexný prístup buggy

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

V iných jazykoch

Táto stránka je v iných jazykoch

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