【问题标题】:Why is NumPy's variance result different from mine?为什么 NumPy 的方差结果与我的不同?
【发布时间】:2021-07-21 23:49:00
【问题描述】:

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

首先,下面的两个 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

【问题讨论】:

  • 我不知道np.mean(abs(myArray-myArray())**2)) 应该做什么,但这不是一个有效的表达方式。这同样适用于np.var(myArray))。此外,您可以为不同的结果添加一个输入示例吗? (方差的计算对输入分布很敏感)
  • @JérômeRichard,感谢您的建议。是的,我可以在几分钟内提供一个示例数组。我从这里的论坛帖子中获取了您提到的第一个表达式(我的方法 2)。我会修改它。
  • myArrayxComponent等之间的关系并不明显。
  • 请展示数组及其组件的示例。
  • @hpaulj,感谢您指出这一点。 myArray 中的值是 xComponent、yComponent、zComponent 与 xComponent、yComponent、zComponent 的点积。我可以编辑问题以添加它。

标签: python python-3.x numpy statistics variance


【解决方案1】:

具有均值 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

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多