2011-05-09 58 views
1

我正在定義一個函數來計算列表的標準偏差。有時這個列表的意思是否定的,所以我的函數不能取消一個負數的平方根,返回給我一個錯誤。有條件負整數

這似乎很簡單,我只是想不起來。我想爲我的函數寫一個條件,說如果有一個負數,乘以-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

if(number <0)否定 – MichaelHouse 2011-05-09 23:54:57

回答

-1

如果你想真正得到創意,你可以廣場以及平方根:

>>> import math 
>>> x = -5 
>>> math.sqrt((-5)**2) 
5.0 

乾杯

+3

上帝禁止您使用abs函數... – luqui 2011-05-10 00:36:01

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

請注意,對於大數據集,此算法可能會因舍入誤差而遭受精度問題。有關更多數字穩定的算法,請參閱https://secure.wikimedia.org/wikipedia/en/wiki/Algorithms_for_calculating_variance。 – btilly 2011-05-10 00:40:57

2

忽略問題的上下文,答案是使用內置的abs。但是,如果您有y = sqrt(x)類型的數學表達式,並且y不能很複雜,那麼x不能是負數。任何負面的x表示一個問題,可能是舍入,包裝,或者,在你的情況下,一個不正確的公式。簡單地乘以-1,或採取abs,不會解決問題,它會給你一個錯誤的答案。您應該考慮如何處理這些情況(儘管我明白,對於標準差的情況,這些錯誤不太可能出現)。