python中的标准偏差 - 浮动对象不可迭代

时间:2012-10-05 14:30:20

标签: python python-3.x

我试图在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 = [],不知道为什么它在那里 - 我现在得到一个答案,但它在数学上是关闭的

  • 更改为dev = sqrt((stdev)/ listcount)并修复了我的数学错误,DSM也确认了此修复程序。谢谢
  • 程序现在正常运行!活泉。谢谢大家的建议。

4 个答案:

答案 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 /....