我可以将numpy.std应用到什么?

问题描述

我对统计知识知之甚少,所以请原谅我,但是我对numpy函数return this.productsService.getProducts().filter(p => p.id == Number.parseInt(params.id));的工作方式感到困惑,很遗憾,文档没有对其进行清理。

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

numpy.std

这是分布:

enter image description here

我不知道我对该函数的工作方式有什么误解。我以为也许我必须告诉它与分布的y值相关联的x值,但是函数中没有关于它的参数。为什么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)) 不返回我的分布的实际标准偏差?

解决方法

我怀疑您完全了解该函数的工作原理,但是误解了数据的含义。标准差是对平均值数据分布的度量。

当您说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用于计算标准偏差。可以按照以下步骤计算

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

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