【问题标题】:Calculate the standard deviation of a gaussian计算高斯的标准差
【发布时间】:2014-05-06 08:12:21
【问题描述】:

我有一个数字列表,当根据它的长度绘制时,它给了我一个高斯。我想计算这个高斯的标准偏差,但是我得到的值(使用 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()

【问题讨论】:

  • 你能提供你的数据值吗?可能在粘贴箱中?
  • 这里是 pastebin 的链接:pastebin.com/nSnvuQLi

标签: python math graph statistics gaussian


【解决方案1】:

您测量的是概率的标准偏差,而不是实际值;这是一个例子,我从真正的标准正态分布中得出:

>>> 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

这里的正确方法是使用这个公式:

测量方差,然后取平方根得到标准差;第一项基本上是二阶矩,第二项是均方:

>>> 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 np.dotdot product;基本上是两个数组的元素乘积的总和;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 2020-01-28
  • 2020-05-25
  • 2012-07-02
  • 2015-11-20
  • 2020-08-13
  • 2019-08-15
相关资源
最近更新 更多