1

我试图在 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)

任何帮助都会很好,谢谢。

- 自我编辑 - 我刚刚从我的 for 循环中删除了 stdev=[],不知道为什么它在那里 - 我现在得到了答案,但它在数学上是关闭的

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

4 回答 4

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))
于 2012-10-05T14:43:34.247 回答
0

首先,删除stdev = [],这没有任何意义(根据您的编辑,您已经这样做了,但它仍然在代码中)。

其次,将行dev = sqrt(stdev/(listcount-1))移出 for 循环(降低缩进级别)。这应该只在条款相加后进行一次。编辑:如@DSM 所指出的,还要修复括号。

于 2012-10-05T14:42:40.283 回答
0

您的代码中的数学错误在这里:

        dev = sqrt((stdev)/listcount-1)

您需要dev = sqrt(stdev/listcount)dev = sqrt(stdev/(listcount-1)),具体取决于您的自由度偏好。修复此问题后,您的(修改后的)代码似乎可以正常工作。

于 2012-10-05T14:49:54.703 回答
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/....

于 2012-10-05T14:50:38.467 回答