Python 为什么是NumPy';s的方差结果和我的不同?
我很难理解方差是如何工作的,如果有人能解释一下我的错误,我将不胜感激 首先,下面的两个NumPy方法为特定数组的差异提供了相同的答案(比我更有Python经验的人告诉我,没有理由怀疑结果!)Python 为什么是NumPy';s的方差结果和我的不同?,python,python-3.x,numpy,statistics,variance,Python,Python 3.x,Numpy,Statistics,Variance,我很难理解方差是如何工作的,如果有人能解释一下我的错误,我将不胜感激 首先,下面的两个NumPy方法为特定数组的差异提供了相同的答案(比我更有Python经验的人告诉我,没有理由怀疑结果!) np.var(myArray) np.mean(abs(myArray-np.mean(myArray))**2) 问题是,当我使用其他人使用的第三种方法时,我得到了不同的结果,但我不明白为什么。我担心Python正在做的事情有一些我不理解的地方。有人能帮我弄清楚吗 第一项-第二项(其中myArray中的一
np.var(myArray)
np.mean(abs(myArray-np.mean(myArray))**2)
第一项-第二项
(其中myArray中的一个元素是xComponent+yComponent+zComponent的平方根,并用它们自己点起来)第一项=(np.dot(xComponent,xComponent)+np.dot(yComponent,yComponent)+np.dot(zComponent,zComponent))/len(zComponent)
当我不使用单个组件,而是使用总值时,我得到了相同的答案;i、 例如,np.mean(myArray**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
随机变量X与平均mu(mu=E[X])的方差可以等价地表示为(此处,在代码块之外,^表示数学中常用的“的幂”):
(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。在你的第一个术语中,每个分量的.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)+…+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
我不知道
np.mean(abs(myArray-myArray())**2))
应该是什么意思,但这不是一个有效的表达式。这同样适用于np.var(myArray))
。此外,您能否为不同的结果添加输入示例?(方差的计算对输入分布很敏感)@JérômeRichard,谢谢你的建议。是的,我可以在几分钟内提供一个示例数组。我从这里的一个论坛帖子中引用了你提到的第一个表达(我的方法2)。我将修改它。myArray
和xComponent
等之间的关系不明显。请给出一个数组及其组件的示例。@hpaulj,感谢您指出这一点。myArray中的值是xComponent、yComponent、zComponent与xComponent、yComponent、zComponent的点积。我可以编辑这个问题来补充。谢谢你的清楚解释。这很有帮助。
>>> 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