我正在定义一个计算列表标准差的函数。有时这个列表的平均值是负数,所以我的函数不能取负数的平方根,给我一个错误。
这似乎很简单,我只是想不起来。我想为我的函数写一个条件,如果有一个负数,则乘以-1,因为不能取负数的平方根。我怎么写这句话?
def stdevValue(lst):
"""calculates the standard deviation of a list of numbers
input: list of numbers
output: float that is the standard deviation
"""
stdev = 0
stdevCalc = (((sum(lst) - (meanValue(x)))/(len(lst)-1)))**0.5
stdev += stdevCalc
return stdev
答案 0 :(得分:16)
您似乎误用了标准差的公式。您根本不需要处理负数平方根的情况。在求和之前,你需要平方值和均值之间的每个差异,如下所示:
def stdevValue(lst):
m = meanValue(x) # wherever this comes from
return (sum((x - m) ** 2 for x in lst) / len(lst)) ** 0.5
这确保总和非负,因此您可以取平方根而不关心负值。 (如果您想要样本标准差,除以(len(lst) - 1)
)。
有关更多信息和示例,请参阅Standard Deviation上的维基百科文章。
答案 1 :(得分:2)
忽略问题的上下文,答案是使用内置的abs
。但是如果你有y = sqrt(x)
类型的数学表达式,并且y
不能很复杂,那么x
就不能是负数。任何否定x
表示问题,可能是舍入,包装,或者在您的情况下,是一个不正确的公式。只需乘以-1或取abs
,就无法解决问题,它会给你错误的答案。您应该考虑如何处理这些情况(尽管我理解,对于标准偏差的情况,这些错误不太可能出现)。
答案 2 :(得分:-1)
如果你想真正发挥创意,你可以平方根和方根:
>>> import math
>>> x = -5
>>> math.sqrt((-5)**2)
5.0
干杯