在numpy中实现这种情况

时间:2016-05-23 03:31:22

标签: python arrays numpy matrix covariance

鉴于这两个阵列:

E = [[16.461, 17.015, 14.676],
 [15.775, 18.188, 14.459],
 [14.489, 18.449, 14.756],
 [14.171, 19.699, 14.406],
 [14.933, 20.644, 13.839],
 [16.233, 20.352, 13.555],
 [16.984, 21.297, 12.994],
 [16.683, 19.056, 13.875],
 [17.918, 18.439, 13.718],
 [17.734, 17.239, 14.207]]

S = [[0.213, 0.660, 1.287],
 [0.250, 2.016, 1.509],
 [0.016, 2.995, 0.619],
 [0.142, 4.189, 1.194],
 [0.451, 4.493, 2.459],
 [0.681, 3.485, 3.329],
 [0.990, 3.787, 4.592],
 [0.579, 2.170, 2.844],
 [0.747, 0.934, 3.454],
 [0.520, 0.074, 2.491]]

问题表明我应该使用以下公式得到S和E之间的3x3协方差矩阵(C):

C = (1/(n-1))[S'E - (1/10)S'i i'E]

这里n是10,并且i是仅由1组成的n×1列向量。 S'和i'分别是矩阵S和列向量i的转置。

到目前为止,我无法得到C因为我不理解i(和i')的含义及其在公式中的实现。使用numpy,到目前为止我做了:

import numpy as np

tS = numpy.array(S).T
C =  (1.0/9.0)*(np.dot(tS, E)-((1.0/10.0)*np.dot(tS, E))) #Here is where I lack the i and i' implementation.

我将非常感谢您帮助理解并实施我和我的公式。输出应为:

C= [[0.2782, 0.2139, -0.1601],
    [-1.4028, 1.9619, -0.2744],
    [1.0443, 0.9712, -0.6610]]

2 个答案:

答案 0 :(得分:2)

看起来你唯一缺少的部分是制作i

>>> i = np.ones((N, 1))
>>> i
array([[ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.],
       [ 1.]])

之后,我们得到

>>> C = (1.0/(N-1)) * (S.T.dot(E) - (1.0/N) * S.T.dot(i) * i.T.dot(E))
>>> C
array([[ 0.27842301,  0.21388842, -0.16011839],
       [-1.4017267 ,  1.96193373, -0.27441417],
       [ 1.04532836,  0.97120807, -0.66095656]])

请注意,这并不是完全生成您期望的数组,如果您对其进行舍入,则会更明显,但是数据中可能存在一些小错误?

>>> C.round(4)
array([[ 0.2784,  0.2139, -0.1601],
       [-1.4017,  1.9619, -0.2744],
       [ 1.0453,  0.9712, -0.661 ]])

答案 1 :(得分:1)

这就是你想要的:

S = numpy.array(S)

E = numpy.array(E)

ones = np.ones((10,1))

C =  (1.0/9)*(np.dot(S.T, E)-((1.0/10)*    (np.dot(np.dot(np.dot(S.T,ones),ones.T),E))))

我的输出是:

array([[ 0.27842301,  0.21388842, -0.16011839],
   [-1.4017267 ,  1.96193373, -0.27441417],
   [ 1.04532836,  0.97120807, -0.66095656]])