在numpy中如何使用特征分解?



在下面的算法中,权重是一个秩为7的2017x2017对称矩阵。

我想对特征分解的列做点什么,但是我甚至不能让它们和回到原始矩阵。Neoweights1 =权重,但neoweights =完全不同的东西。这里的误差是多少?

w,v = np.linalg.eig(weights)
neoweights1 = w2 * (v2 @ v2.T)
neoweights = np.zeros((matsize,matsize))
for i in range(7):
neoweights += np.real(w2[i] * (v2[i] @ v2[i].T))

您的示例没有显示w2和v2来自何处,但我猜它们也是np. linalgg .eig的结果。在这种情况下,注意v2中的每一列都是一个特征向量。但是v2[i]给你一行。

之后,v2[i] @ v2[i].T是一个向量点积,这意味着整个表达式neoweights += np.real(w2[i] * (v2[i] @ v2[i].T))只是给矩阵的每个元素加了一个标量值。

这就是你想要的:

neoweights = sum(np.real(np.outer(w[i] * v[:,i], v[:,i])) for i in range(7))

对于矩阵表达式,你必须注意什么时候以及如何用权值做乘法。这应该可以工作:np.real(w * v @ v.T)

最新更新