我正在遵循步骤顺序:
给定 A 是 m × n,那么我们对 A = USVT 执行 SVD
然后求U’=(1/2)(U+UT)得到对称矩阵
然后,对 U’, m × m 进行特征值分解。
提取与正特征值相对应的正特征向量并形成矩阵 X,即 m × k
对XTX进行SVD,得到SO(n)中正特征值的U
重复步骤 4 和 5,但对于负特征向量
但是,我似乎无法获得正特征值的正确 U(正如我使用 SVD 和特征向量计算器在线验证的那样)并且负特征向量不存在。对以下内容有任何帮助或我可以做出任何改进吗?
import numpy as np
def svd(A):
U, S, VT = np.linalg.svd(A, full_matrices=True)
return U, S, VT
def symmetric(U):
U_symmetric = 0.5 * (U + U.T)
return U_symmetric
def eigenvalue_decomposition(U):
eigenvalues, eigenvectors = np.linalg.eig(U)
return eigenvalues, eigenvectors
def extract_positive_eigenvectors(eigenvalues, eigenvectors):
positive_indices = np.where(eigenvalues > 0)
if len(positive_indices[0]) == 0:
return None
X = eigenvectors[:, positive_indices]
return X
def extract_negative_eigenvectors(eigenvalues, eigenvectors):
negative_indices = np.where(eigenvalues < 0)
if len(negative_indices[0]) == 0:
return None
X = eigenvectors[:, negative_indices]
return X
A = np.array([[1, 2, 2], [0, 1, 2]])
U, _, _ = svd(A)
U_symmetric = symmetric(U)
eigenvalues, eigenvectors = eigenvalue_decomposition(U_symmetric)
# extract positive eigenvectors (if any)
X_positive = extract_positive_eigenvectors(eigenvalues, eigenvectors)
if X_positive is not None:
X_positive_2d = X_positive.reshape(X_positive.shape[0], -1)
U_positive, _, _ = svd(np.dot(X_positive_2d.T, X_positive_2d))
else:
U_positive = None
print("Matrix U from SVD of XTX for positive eigenvectors:")
print(U_positive)
# extract negative eigenvectors (if any)
X_negative = extract_negative_eigenvectors(eigenvalues, eigenvectors)
if X_negative is not None:
X_negative_2d = X_negative.reshape(X_negative.shape[0], -1)
U_negative, _, _ = svd(np.dot(X_negative_2d.T, X_negative_2d))
else:
U_negative = None
print("Matrix U from SVD of XTX for negative eigenvectors:")
print(U_negative)
extract_positive_eigenvectors
中,您需要使用从np.where获得的索引来正确提取相应的特征向量。目前,您直接使用索引,这会导致切片不正确。X = eigenvectors[:, positive_indices[0]] # for positive eigenvectors
extract_negative_eigenvectors
功能相同。X = eigenvectors[:, negative_indices[0]] # for negative eigenvectors