为什么 NumPy 的方差结果和我的不一样?
Why is NumPy's variance result different from mine?
我在理解方差的工作原理时遇到了很多麻烦,如果有人能解释我哪里出错了,我将不胜感激。
首先,下面的两个 NumPy 方法为特定数组的方差提供了相同的答案(比我更有 Python 经验的人告诉我没有理由怀疑结果!)。
np.var(myArray)
np.mean(abs(myArray - np.mean(myArray))**2)
问题是,当我使用别人使用的第三种方法时,我得到了不同的结果,但我不明白为什么。我担心 Python 在做什么我不明白。谁能帮我解决这个问题?
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 的方差可以等价地表示为(此处,在代码块之外,^ 表示“的幂”,如通常使用的那样数学):
- Var(X) = E[(X-mu)^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
我在理解方差的工作原理时遇到了很多麻烦,如果有人能解释我哪里出错了,我将不胜感激。
首先,下面的两个 NumPy 方法为特定数组的方差提供了相同的答案(比我更有 Python 经验的人告诉我没有理由怀疑结果!)。
np.var(myArray)
np.mean(abs(myArray - np.mean(myArray))**2)
问题是,当我使用别人使用的第三种方法时,我得到了不同的结果,但我不明白为什么。我担心 Python 在做什么我不明白。谁能帮我解决这个问题?
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 的方差可以等价地表示为(此处,在代码块之外,^ 表示“的幂”,如通常使用的那样数学):
- Var(X) = E[(X-mu)^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