我試圖在不使用numpy任何外部庫的情況下計算 python 中的標準偏差,除了math. 我想在撰寫演算法方面做得更好,并且在提高我的 Python 技能時,我只是將其作為一項“家庭作業”。我的目標是將這個公式翻譯成 python,但沒有得到正確的結果。
我正在使用一系列速度,其中 speeds = [86,87,88,86,87,85,86]
當我運行時:
std_dev = numpy.std(speeds)
print(std_dev)
我得到:0.903507902905。但我不想依賴 numpy。所以...
我的實作如下:
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)
現在當我運行時:
std_dev = get_std_dev(speeds)
print(std_dev)
我得到:[0]但我期待 0.903507902905
我在這里錯過了什么?
uj5u.com熱心網友回復:
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
uj5u.com熱心網友回復:
您代碼中的問題是重用陣列并在回圈中間回傳
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
現在讓我們看看您正在使用的演算法。請注意,有兩個常用的標準偏差公式。關于哪一個是正確的,存在各種爭論。
sqrt(sum((x - mean)^2) / n)
或者
sqrt(sum((x - mean)^2) / (n -1))
第一個公式可以簡化為
var1 = sum(x^2) /n - mean^2
sqrt(var1)
和第二個公式
sqrt(var1 * n / (n - 1))
那么你將如何在 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
def std_dev2(array):
n = len(array)
mean = sum(array) / n
sumsq = sum(v * v for v in array)
return ((sumsq / n - mean * mean)*(n/n-1)) ** 0.5
uj5u.com熱心網友回復:
代碼中的一些問題,其中之一是for陳述句中的回傳值。你可以試試這個
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)
uj5u.com熱心網友回復:
這個。您需要擺脫return內部 for 回圈。
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
uj5u.com熱心網友回復:
如果你不想使用numpy它可以嘗試statistics在 python 中打包
import statistics
st_dev = statistics.pstdev(speeds)
print(st_dev)
或者如果您仍然愿意使用自定義解決方案,那么我建議您使用以下方式使用串列理解而不是復雜的錯誤方法
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/364323.html
