Comment dois-je calculer l'écart type en python sans utiliser numpy?

0

La question

Je suis en train de calculer l'écart type en python sans l'utilisation de numpy ou toute une bibliothèque externe, sauf pour math. Je veux m'améliorer à l'écriture d'algorithmes et je suis juste le faire un peu de "devoirs" comme je l'ai améliorer mon python compétences. Mon but est de traduire cette formule en python mais je ne suis pas d'obtenir le résultat correct.

Je suis à l'aide d'un tableau de vitesse, speeds = [86,87,88,86,87,85,86]

Quand je le lance:

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

J'obtiens: 0.903507902905. Mais je ne veux pas compter sur numpy. Alors...

Mon application est comme suit:

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)

Maintenant quand je le lance:

std_dev = get_std_dev(speeds)
print(std_dev)

J'obtiens: [0] mais je suis dans l'attente d'0.903507902905

Ce qui me manque ici?

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

La meilleure réponse

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

Lorsque je cours, que je reçois 1.0.
bkleeman

Redémarrez votre python noyau. Quelque chose que vous avez fait a vissé avec un des fonctions intégrées.
CJR

Oh, jamais l'esprit, vous êtes à l'aide de python2.7, arent vous. Ajouter from __future__ import division - la division standard / n'est pas vrai de la division jusqu'à ce que python 3.0, à moins que vous importez à partir d'avenir.
CJR

oui, je suis en utilisant 2.7. Votre solution plus l'avenir de la division d'importation est de travailler pour moi maintenant. Merci beaucoup pour l'aide!
bkleeman

Il est temps de passer à py3, mate.
CJR

Je suis assez nouveau à python et je n'ai pas encore trouvé la rime ou raison pour lors de mes passages en machine py2 vs py3 pour être honnête. Je vais avoir à obtenir cette triés.
bkleeman

Beaucoup de distributions linux navire avec py2.7 et py3 - vous avez probablement python3 (mais le binaire est python3 au lieu de simplement python). Vous pouvez également envisager d'utiliser quelque chose comme anaconda pour configurer les environnements. py2.7 est bien passé en fin de vie.
CJR
1

Le problème dans votre code est la réutilisation de tableau et de retour dans le milieu de la boucle

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

Maintenant, penchons-nous sur l'algorithme que vous utilisez. Notez qu'il existe deux std écart des formules qui sont couramment utilisés. Il y a plusieurs arguments, dont l'un est correcte.

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

ou

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

Pour de grandes valeurs de n, la première formule est utilisée depuis le -1 est insignifiant. La première formule peut être réduite à

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

Alors, comment voulez-vous le faire en 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

certains problèmes dans le code, l'un d'eux est la valeur de retour à l'intérieur de l'instruction for. vous pouvez essayer cette

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

C'. Vous avez besoin de se débarrasser de return à l'intérieur des boucles.

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

Si vous ne souhaitez pas l'utiliser numpy son ok essayer statistics package python

import statistics

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

ou, si vous êtes toujours prêt à l'utilisation d'une solution personnalisée alors je vous recommande d'utiliser la manière suivante à l'aide de la liste de compréhension au lieu de la complexité de votre buggy approche

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

Dans d'autres langues

Cette page est dans d'autres langues

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