Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么是NumPy';s的方差结果和我的不同?_Python_Python 3.x_Numpy_Statistics_Variance - Fatal编程技术网

Python 为什么是NumPy';s的方差结果和我的不同?

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中的一

我很难理解方差是如何工作的,如果有人能解释一下我的错误,我将不胜感激

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

  • np.var(myArray)
  • np.mean(abs(myArray-np.mean(myArray))**2)
  • 问题是,当我使用其他人使用的第三种方法时,我得到了不同的结果,但我不明白为什么。我担心Python正在做的事情有一些我不理解的地方。有人能帮我弄清楚吗

  • 第一项-第二项
    (其中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])的方差可以等价地表示为(此处,在代码块之外,^表示数学中常用的“的幂”):

  • 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。在你的第一个术语中,每个分量的.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