计算高斯分布的标准差

4
我有一组数字,当它们与其长度绘制成高斯图时,我想计算该高斯图的标准偏差。但是,我得到的值(使用np.std()函数)明显太小了(我得到的大约是0.00143...,而应该是8.234...)。我认为我一直在计算y轴上的标准偏差,而不是x轴上的(标准偏差应该在x轴上),但我不知道该如何处理?以下是我的代码和我试图计算std dev的高斯图。
#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


你能提供你的数据值吗?可以用pastebin吗? - Ffisegydd
这是过去的粘贴链接:http://pastebin.com/nSnvuQLi - Calculus5000
1个回答

7

您正在测量概率的标准差而非实际值;以下是一个例子,我从真正的标准正态分布中进行绘制:

>>> 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,这与我从标准正态分布中绘制的事实一致。

嗨,谢谢分享。这很有道理。但是,我是Python的新手,我不理解你在第二个代码框中的前两行代码。你能简要解释一下吗? - Calculus5000
@Calculus5000 np.dot点积;基本上是两个数组逐元素相乘后求和的结果; - behzad.nouri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接