将向量乘以协方差矩阵?

机器算法验证 最小二乘 协方差 特征值
2022-03-24 23:11:10

我以为我知道协方差,但我开始认为还有更多。例如,当您将观测值乘以其相应的协方差矩阵时会发生什么?[x1,y1] * cov(x,y). 我做了一个小实验,对结果很感兴趣。

import matplotlib.pyplot as plt
import numpy as np

mean = [0, 0]
cov = [[1, 0.9], [0.9, 1]] 

x, y = np.random.multivariate_normal(mean, cov, 1000).transpose()
plt.scatter(x, y)
plt.show()

xy_line

new_x = []
new_y = []
for i in range(500):
  vec = np.array([x[i],y[i]])
  trsf = np.matmul(vec.transpose(),cov)
  new_x.append(trsf[0])
  new_y.append(trsf[1])

plt.scatter(new_x,new_y)   

cov_line

如您所见,每个 (x,y) 对都投影到一条没有任何偏差的线上。我很好奇到底发生了什么?我的猜测是(A)这些数据点被投影到 OLS 线上。或者 (B) 这些数据点被投影到协方差矩阵的前导特征向量上。

有什么想法/想法吗?

1个回答

它们并不完全在一条线上,但是是的,它们通常遵循主特征向量,因为投影点具有以下坐标(假设尺寸为): 这里,是特征向量,是特征值。由于并且对于方向上的大部分数据分量都大于之前的系数通常远大于x2×1

Σx=σ1u1u1Tx+σ2u2u2Tx=(σ1<u1,x>)u1+(σ2<u2,x>)u2
uiσiσ1>σ2x1x2u1Tu2T. 这导致点大多与第一个特征向量对齐。

如果有一些异常值,尤其是几乎的方向对齐太多。u1

import matplotlib.pyplot as plt
import numpy as np

mean = [0, 0]
cov = [[1, 0.9], [0.9, 1]] 

x, y = np.random.multivariate_normal(mean, cov, 1000).transpose()
x = np.hstack([x, -10])
y = np.hstack([y, 10])

plt.scatter(x, y)
plt.show()

在此处输入图像描述

new_x = []
new_y = []
for i in range(len(x)):
  vec = np.array([x[i],y[i]])
  trsf = np.matmul(vec.transpose(),cov)
  new_x.append(trsf[0])
  new_y.append(trsf[1])

plt.scatter(new_x,new_y)   

在此处输入图像描述