Python'da numpy kullanmadan standart sapmayı nasıl hesaplayabilirim?

0

Soru

Python'da standart sapmayı kullanmadan hesaplamaya çalışıyorum numpy veya herhangi bir harici kütüphane hariç math. Algoritmalar yazarken daha iyi olmak istiyorum ve python becerilerimi geliştirirken bunu biraz "ödev" olarak yapıyorum. Amacım bu formülü python'a çevirmek ama doğru sonucu alamıyorum.

Bir dizi hız kullanıyorum speeds = [86,87,88,86,87,85,86]

Kaçtığımda:

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

Alıyorum: 0.903507902905. Ama numpy'ye güvenmek istemiyorum. Böyle...

Uygulamam aşağıdaki gibidir:

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)

Şimdi kaçtığımda:

std_dev = get_std_dev(speeds)
print(std_dev)

Alırım: [0] ama 0.903507902905 bekliyorum

Burada neyi kaçırıyorum?

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

En iyi cevabı

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

Koştuğumda bunu alıyorum. 1.0.
bkleeman

Python çekirdeğinizi yeniden başlatın. Yaptığın bir şey, yerleşik işlevlerden birini mahvetti.
CJR

Oh, boşver, sen kullanarak python2.7, sen değil. Eklemek from __future__ import division - standart bölüm / gelecekten içe aktarmadığınız sürece python 3.0'a kadar doğru bölünme değildir.
CJR

evet 2.7 kullanıyorum. Çözümünüz artı gelecekteki bölüm ithalatı artık benim için çalışıyor. Yardımlarınız için çok teşekkür ederim!
bkleeman

Py3'e geçme zamanı dostum.
CJR

Python'da oldukça yeniyim ve dürüst olmak gerekirse, makinemin py2 vs py3'ü ne zaman çalıştırdığına dair kafiye veya sebebi henüz anlamadım. Bunu halletmem gerekecek.
bkleeman

Birçok linux dağıtımı py2.7 ve py3 ile birlikte gelir - muhtemelen python3'ünüz vardır (ancak ikili python3 sadece yerine python). Ortamları ayarlamak için anaconda gibi bir şey kullanmayı da düşünebilirsiniz. py2.7-hayat-çok geç artık sonuna geldik.
CJR
1

Kodunuzdaki sorun, diziyi yeniden kullanmak ve döngünün ortasına geri dönmektir

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

Şimdi kullandığınız algoritmaya bakalım. Yaygın olarak kullanılan iki std sapma formülü olduğunu unutmayın. Hangisinin doğru olduğuna dair çeşitli argümanlar var.

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

veya

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

N'nin büyük değerleri için, -1 önemsiz olduğu için ilk formül kullanılır. İlk formül şu şekilde azaltılabilir

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

Peki bunu python'da nasıl yaparsın?

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

koddaki bazı sorunlar, bunlardan biri for deyiminin içindeki dönüş değeridir. bu deneyebilirsiniz

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

Bu. Sen kurtulmak gerekir return döngüler için içeride.

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

Kullanmak istemiyorsanız numpy onun tamam bir deneyin statistics python'da paket

import statistics

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

ya da hala özel bir çözüm kullanmaya istekliyseniz, karmaşık buggy yaklaşımınız yerine liste anlama özelliğini kullanarak aşağıdaki yolu kullanmanızı öneririm

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

Diğer dillerde

Bu sayfa diğer dillerde

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