给定这两个数组:
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 x 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.
我将非常感谢您帮助理解和实施公式中的i和i'。输出应为:
C= [[0.2782, 0.2139, -0.1601],
[-1.4028, 1.9619, -0.2744],
[1.0443, 0.9712, -0.6610]]
看起来
您唯一缺少的部分是制作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 ]])
我想这就是你想要的:
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]])