2 回答
TA贡献1821条经验 获得超6个赞
我怀疑您完全理解该函数的工作原理,但误解了数据的含义。标准偏差是衡量数据关于平均值的分布的量度。
当您说 时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
TA贡献1863条经验 获得超2个赞
np.std 用于计算标准偏差。这可以按以下步骤计算
首先我们需要计算分布均值
然后找到 (x - x.mean)**2 的总和
然后求出上述求和的均值(除以分布中的元素个数)
然后求此均值的平方根(在步骤 3 中计算)。
因此,此函数正在计算传递给它的分布的标准偏差。
添加回答
举报