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 中計算)。
因此,此函數正在計算傳遞給它的分布的標準偏差。
添加回答
舉報