为什么 NumPy 的方差结果和我的不一样?

Why is NumPy's variance result different from mine?

我在理解方差的工作原理时遇到了很多麻烦,如果有人能解释我哪里出错了,我将不胜感激。

首先,下面的两个 NumPy 方法为特定数组的方差提供了相同的答案(比我更有 Python 经验的人告诉我没有理由怀疑结果!)。

  1. np.var(myArray)
  2. np.mean(abs(myArray - np.mean(myArray))**2)

问题是,当我使用别人使用的第三种方法时,我得到了不同的结果,但我不明白为什么。我担心 Python 在做什么我不明白。谁能帮我解决这个问题?

  1. First term - second term(其中 myArray 中的一个元素是 xComponent + yComponent + zComponent 的平方根点缀自身)。

First term = (np.dot(xComponent, xComponent) + np.dot(yComponent, yComponent) + np.dot(zComponent, zComponent))/len(zComponent)

当我不使用单个组件而是使用总值时,我得到相同的答案;即 np.mean(myArray**2).

Second term=np.mean(xComponent)**2 + np.mean(yComponent)**2 + np.mean(zComponent)**2

从第一项中减去第二项得到的结果与我使用上述方法 1 和 2 从 NumPy 得到的结果截然不同。此方法做的一件事是方法 2 做不到的,那就是为第二项提供一个很小的数字。我读到第二项应该很小,虽然我不明白为什么。


编辑: 这是一个示例数组。它比我通常使用的数据集短得多。我目前无法对其进行测试,但会尽快进行测试,以检查它是否代表我的问题,就像完整数据集一样。

myArray=np.array([33.4479672],
                 [36.1206867],
                 [33.84485692],
                 [27.28590267],
                 [21.85568418],
                 [17.01874484],
                 [25.50861718],
                 [29.40798574],
                 [36.71092762],
                 [45.72983789],
                 [40.47352496]])

这里是对应的x、y、z分量:

23.7427145, -7.72698565, 22.25631845
25.37794739, -9.0226496, 24.06772919
22.1871844, 2.31027064, 25.4532088
19.29475621, 8.9243651, 17.1052207
9.18913589, 18.3261273, -7.57520763
10.00418173, 5.86260433, -12.45728278
-4.0904234, 15.13497563, 20.12189104
-12.83798541, -16.57398946, 20.62325458
-5.6879695, -21.33899754, 29.32552461
19.06079677, 28.16146311, 30.57508946
25.88007, 27.25161939, 15.02256438

平均为 mu (mu = E[X]) 的随机变量 X 的方差可以等价地表示为(此处,在代码块之外,^ 表示“的幂”,如通常使用的那样数学):

  1. Var(X) = E[(X-mu)^2]
  2. Var(X) = E[X^2] - (E[X])^2 = E[X^2] - (mu)^2

您的第二种方法使用第一种形式的定义。您的第三种方法似乎尝试使用第二种形式,但没有正确执行。

你的第一个词,(np.dot(xComponent, xComponent) + np.dot(yComponent, yComponent) + np.dot(zComponent, zComponent))/len(zComponent) 等于 np.mean(myArray**2),因为他们计算的是同样的东西。对于数组中具有分量 x、y 和 z 的元素 a,根据定义,您有 a^2 = x+2 + y^2 + z^2。在您的第一个术语中,每个组件的 np.dot 按元素计算该特定组件的平方和,然后将其加起来用于所有三个组件。除以数组的长度然后得到平方的平均值。

因此,您的第一项代表 E[X^2]。

要计算方差,您需要减去 E[X]^2。所以,你的第二个任期应该是np.mean(myArray)**2。我认为没有任何简单的方法可以使用组件来表示它。如果您的数组是 X=[a1,a2,...,an],其组件为 [x1,y1,z1]、[x2,y2,z2]、...、[xn,yn,zn],则 E[ X]^2 = ((sqrt(x1^2+y1^2+z1^2)+sqrt(x2^2+y2^2+z2^2)+...+sqrt(xn^2+yn^2 +zn^2))/n)^2,你不能把这三个部分完全分开。可能是您看到的代码中的值有一些特定的 属性 使得结果相同。

所以,最后,举个例子:

>>> myArray
array([[33.4479672 ],
       [36.1206867 ],
       [33.84485692],
       [27.28590267],
       [21.85568418],
       [17.01874484],
       [25.50861718],
       [29.40798574],
       [36.71092762],
       [45.72983789],
       [40.47352496]])
>>> xComponent
array([ 23.7427145 ,  25.37794739,  22.1871844 ,  19.29475621,
         9.18913589,  10.00418173,  -4.0904234 , -12.83798541,
        -5.6879695 ,  19.06079677,  25.88007   ])
>>> yComponent
array([ -7.72698565,  -9.0226496 ,   2.31027064,   8.9243651 ,
        18.3261273 ,   5.86260433,  15.13497563, -16.57398946,
       -21.33899754,  28.16146311,  27.25161939])
>>> zComponent
array([ 22.25631845,  24.06772919,  25.4532088 ,  17.1052207 ,
        -7.57520763, -12.45728278,  20.12189104,  20.62325458,
        29.32552461,  30.57508946,  15.02256438])
>>> np.var(myArray)
63.77153203225587
>>> np.mean(abs(myArray - np.mean(myArray))**2)
63.77153203225587
>>> (np.dot(xComponent, xComponent) + np.dot(yComponent, yComponent) + np.dot(zComponent, zComponent))/len(zComponent) -
  np.mean(myArray)**2
63.77153212702058