绘制特征向量

数据挖掘 主成分分析 matplotlib
2022-01-31 13:53:39

我从 multivariate_normal 生成了两团 3d 点云

data = np.random.multivariate_normal([2,2,2],[[1,0,0],[0,5,0],[0,0,10]], 
size=500)
data = np.vstack((data, np.random.multivariate_normal([-2,-2,-2], [[1,0,0],[0,5,0],[0,0,10]], size=500)))
data = data - data.mean(axis=0)

并尝试像这样进行 PCA

covmat = np.cov(data.T)
v, W = np.linalg.eig(covmat)

并绘制:

def get_vec(eig_v, eig_vec):
    t = np.linspace(0, eig_v)
    return np.array([np.array(v * eig_vec) for v in t])

def ang(v1, v2):
    return np.rad2deg(np.arccos(np.dot(v1,v2)/np.linalg.norm(v1)/np.linalg.norm(v2)))

l1 = get_vec(v[0], W[:,0])
l2 = get_vec(v[1], W[:,1])
l3 = get_vec(v[2], W[:,2])
x = data[:,0]
y = data[:,1]
z = data[:,2]
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(l1[:,0],l1[:,1],l1[:,2], c='r')
ax.plot(l2[:,0],l2[:,1],l2[:,2], c='b')
ax.plot(l3[:,0],l3[:,1],l3[:,2], c='y')
ax.scatter(x,y,z,c='g')
plt.show()

这就是我得到的: 在此处输入图像描述

很明显,轴不是正交的。我已经检查过了,它们在数字方面似乎是正交的:

print(ang(W[:,0], W[:,1]))
print(ang(W[:,0], W[:,2]))
print(ang(W[:,1], W[:,2]))

90.00000000000003 89.99999999999999 90.0 这么小的误差会不会造成这么大的视觉差异?

1个回答

PCA 投影看起来并不正交,因为您的图形轴不相等。

将所有轴设置为相等,如下所示:

ax.axis('equal')

或者

ax.xlim(-5, 5)
ax.ylim(-5, 5)
ax.zlim(-5, 5)
ax.gca().set_aspect('equal')