计算高斯的标准差

4 投票
1 回答
7682 浏览
提问于 2025-04-18 00:08

我有一组数字,当我把它们的长度画出来时,形成了一个高斯曲线。我想计算这个高斯曲线的标准差,但我得到的值(用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()

在这里输入图片描述

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,这和我从标准正态分布中抽取数据的事实是一致的;

撰写回答