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

Python 我可以将numpy.std()应用于什么?,python,numpy,standard-deviation,Python,Numpy,Standard Deviation,我对统计学知之甚少,所以请原谅,但我对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

我对统计学知之甚少,所以请原谅,但我对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))
以下是分发:


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

np.std用于计算标准偏差。这可按以下步骤计算

  • 首先,我们需要计算分布的平均值
  • 然后求(x-x.mean)**2的和
  • 然后找到上述求和的平均值(除以分布中的元素数)
  • 然后找到该平均值的平方根(在步骤3中计算)

  • 因此,此函数正在计算传递给它的分布的标准偏差。

    我怀疑您完全理解此函数的工作原理,但误解了数据的含义。标准偏差是关于平均值的数据传播的度量

    当你说
    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
    

    y值的标准偏差不同于由yIt加权的x的标准偏差。您的问题不清楚:您是否知道
    np.std
    的典型用途是将其应用于某些(可能未知)分布的随机样本,而不是已知分布的PDF图?例如,您希望
    np.std(np.random.normal(loc=1.0,scale=0.5,size=1000))
    给出的值接近
    0.5
    。那么为什么OP的结果是0.2而不是0.5呢?非常感谢,这很有意义!那么,您知道如何使用numpy.std()来找到该分布的标准偏差吗?“还是我必须手动完成?”佩特拉说。你也许可以通过调用
    std
    mean
    等来重铸这个公式,但我认为这不值得你花时间。@Petra。别忘了选择答案,还要向上投票。你确定标准偏差中的分母应该是f的和,而不是它的大小,因为标准偏差公式的分母是N个样本点中的N吗?@Petra。将标准偏差视为平均值的平方根。这是平均平方误差这一事实在目前并不重要。如果您接受加权平均值定义背后的推理
    m=(x*f).sum()/f.sum()
    ,则加权标准差的定义方式相同,但仅用
    (x-m)**2
    代替
    x
    。试着直观地理解这些定义,而不是在第一次学习它们时仅仅把它们当作公式。