2014-03-27 65 views
2

我有一個數字列表,當它與其長度作圖時,給了我一個高斯。我想計算這個高斯的標準偏差,但是我得到的值(使用np.std()函數)顯然太小(我得到類似0.00143的東西......當它應該是8.234 ...時)。我認爲我一直在計算y軸上的標準偏差,而不是x軸上的(這是標準偏差應該是什麼),但我有點卡住瞭如何做到這一點?計算高斯的標準差

我已經包括我的代碼和高斯的圖片我正在試圖計算標準開發。

#max_k_value_counter counts the number of times the maximum value of k comes up. 

max_k_value_counter_sum = sum(max_k_value_counter) 
prob_max_k_value = [0] * len(max_k_value_counter) 

# Calculate the probability of getting a particular value for k 
for i in range(len(max_k_value_counter)): 
     prob_max_k_value[i] = float(max_k_value_counter[i])/max_k_value_counter_sum 

print "Std dev on prob_max_k_value", np.std(prob_max_k_value) 

# Plot p(k) vs k_max to calculate the errors on k 
plt.plot(range(len(prob_max_k_value)), prob_max_k_value) 
plt.xlim(0, 200) 
plt.xlabel(r"$k$", fontsize=16) 
plt.ylabel(r"$p(k)$", fontsize=16) 
plt.show() 

enter image description here

+0

你能提供你的數據值嗎?可能在一個pastebin? – Ffisegydd

+0

這裏是pastebin的鏈接:http://pastebin.com/nSnvuQLi – Calculus5000

回答

4

你測量的概率不是實際值的標準差;這裏,就是一個例子,在這裏我從真正的標準正態分佈得出:

>>> from scipy.stats import norm 
>>> xs = np.linspace(-3, 3, 100) 
>>> pdf = norm.pdf(xs) 
>>> prob = pdf/pdf.sum() # these are probabilities 
>>> np.std(prob)   # note the very small value below 
0.008473522157507624 

這裏的正確方法是使用這個公式: variance

測量偏差,然後取平方根來獲得標準偏差;第一項是基本的二階矩和第二項是均方差:

>>> mu = xs.dot(prob)    # mean value 
>>> mom2 = np.power(xs, 2).dot(prob) # 2nd moment 
>>> var = mom2 - mu**2    # variance 
>>> np.sqrt(var)      # standard deviation 
0.98764819824739092 

注意,我們得到的值非常接近1這是一個事實,即我從標準正態分佈得出一致的;

+0

嗨,感謝分享。這是有道理的。但是,我是python的新手,我不明白你在第二個代碼框中的前兩行代碼。你能簡單地解釋一下嗎? – Calculus5000

+0

@ Calculus5000'np.dot'是[dot product](http://en.wikipedia.org/wiki/Dot_product#Algebraic_definition);兩個陣列的元素級乘積的基本求和; –