我可以将 numpy.std() 应用于什么?

我对统计知识知之甚少,所以请原谅我,但我对 numpy 函数的工作原理感到非常困惑std,不幸的是文档没有清理它。


据我了解,它将计算数组分布的标准差,但是当我使用0.5以下代码设置标准差为 的高斯分布时,numpy.std返回 0.2:


sigma = 0.5

mu = 1

x = np.linspace(0, 2, 100)

f = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp((-1 / 2) * ((x - mu) / sigma)**2)

plt.plot(x, f)

plt.show()

print(np.std(f))

这是分布:

http://img4.mukewang.com/649140d20001e03a05630384.jpg

我不知道我对函数的工作原理有什么误解。我想也许我必须告诉它与分布的 y 值相关联的 x 值,但在函数中没有参数。为什么numpy.std不返回我的分布的实际标准偏差?



ABOUTYOU
浏览 138回答 2
2回答

达令说

我怀疑您完全理解该函数的工作原理,但误解了数据的含义。标准偏差是衡量数据关于平均值的分布的量度。当您说 时std(f),您正在计算 y 值关于其均值的分布。查看问题中的图表,~0.5 的垂直平均值和~0.2 的标准偏差并不遥远。请注意,它std(f)不以任何方式涉及 x 值。您期望得到的是 x 值的标准差,由 y 值加权。这本质上是概率密度函数 (PDF) 背后的思想。让我们手动完成计算以了解差异。x 值的平均值通常为x.sum() / x.size. 但这只有在每个值的权重为 1 时才是正确的。如果你用相应的f值对每个值进行加权,你可以写m = (x * f).sum() / f.sum()标准差是均值的均方根。这意味着计算与平均值的平均平方偏差,并取平方根。我们可以用与之前完全相同的方式计算平方偏差的加权平均值: s = np.sqrt(np.sum((x - m)**2 * f) / f.sum())请注意,根据您的问题以这种方式计算的值s不是 0.5,而是 0.44。这是因为您的 PDF 不完整,缺失的尾部会显着增加传播。这是一个示例,显示当您为更大的 PDF 样本计算标准差时,标准差会收敛到预期值:>>> def s(x, y):...     m = (x * y).sum() / y.sum()...     return np.sqrt(np.sum((x - m)**2 * y) / y.sum())>>> sigma = 0.5>>> x1 = np.linspace(-1, 1, 100)>>> y1 = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(-0.5 * (x1 / sigma)**2)>>> s(x1, y1)0.4418881290522094>>> x2 = np.linspace(-2, 2, 100)>>> y2 = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(-0.5 * (x2 / sigma)**2)>>> s(x2, y2)0.49977093783005005>>> x3 = np.linspace(-3, 3, 100)>>> y3 = (1 / (sigma * np.sqrt(2 * np.pi))) * np.exp(-0.5 * (x3 / sigma)**2)>>> s(x3, y3)0.49999998748515206

小唯快跑啊

np.std 用于计算标准偏差。这可以按以下步骤计算首先我们需要计算分布均值然后找到 (x - x.mean)**2 的总和然后求出上述求和的均值(除以分布中的元素个数)然后求此均值的平方根(在步骤 3 中计算)。因此,此函数正在计算传递给它的分布的标准偏差。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python