我试图在python中找到数字的标准偏差。这是一个入门级编程类,所以我避免尝试使用函数,因为它们还没有被引入。
这个程序允许我在列表中添加数字,分析所述列表,然后显示平均值,最小值,最大值,STDev等。我已成功显示除STDev之外的所有内容,我不断得到的错误是浮动对象不可迭代。这是相关部分的代码:
elif (menuchoice == 4):
sum = 0.0
print("std deviation")
stdev = 0.0
for i in range(listcount):
scorenum4 = eval(scorenum[i])
scoreaverage2 += scorenum4
scoreaverage2 /= listcount
for i in range(listcount):
stdev = []
scorenum3 = eval(scorenum[i])
stdev += (scorenum3 - scoreaverage2)**2
dev = sqrt((stdev)/listcount-1)
print(dev)
任何帮助都是geat,谢谢。
- 自我编辑 - 我刚从我的for循环中删除了stdev = [],不知道为什么它在那里 - 我现在得到一个答案,但它在数学上是关闭的
答案 0 :(得分:5)
这是计算标准差的一种非常漫长的方式。这是一种更加pythonic的方式,我敢说它也更具可读性。
mean = sum(scorenum, 0.0) / len(scorenum)
d = [ (i - mean) ** 2 for i in scorenum]
std_dev = math.sqrt(sum(d) / len(d))
答案 1 :(得分:0)
首先,删除stdev = []
,这是没有任何意义的(根据您已编辑的编辑,但它仍在代码中)。
其次,将行dev = sqrt(stdev/(listcount-1))
移出for循环(降低缩进级别)。这些条款在加起来后应该只进行一次。 编辑:同样修复括号,如@DSM所指出。
答案 2 :(得分:0)
您的代码中存在数学错误:
dev = sqrt((stdev)/listcount-1)
您需要dev = sqrt(stdev/listcount)
或dev = sqrt(stdev/(listcount-1))
,具体取决于您的d.o.f.偏爱。解决此问题后,您的(修改过的)代码似乎可以正常工作。
答案 3 :(得分:0)
另一个答案提出了一种更加pythonic的做法,但我在这里提出了一个修正。 它不是那么有效,但经典算法对于初学者来说更容易理解。
假设scorenum是存储您需要的数据和STD的数组。
import math
average=0.0
for ii in scorenum: # iterate the data array, it can contain float
sum+=ii
average/=float(len(scorenum)) # number of data=array length
# now, compute an estimator of std=sqrt(variance/n), where variance=sum((xi-xavg)**2)
std=0.0
for ii in scorenum:
std+=(ii-average)**2
std=math.sqrt(std/float(len(scorenum))) # if you prefer n-1: std/float(len(scorenum)-1)
print "average=",average," std=",std
评论: - 你可以迭代任何类型的数组 - 你必须导入数学库 - 像+ =和/ =这样的运营商在这里是为了好看。它们相当于sum = sum + ii,average = average /....