从特征分解中提取特征向量

Extracting eigenvectors from eigendecomposition

提问人:meatball2000 提问时间:9/21/2023 更新时间:9/21/2023 访问量:35

问:

我遵循以下步骤:

  1. 给定 A 是 m x n,那么我们在 A = USVT 上执行 SVD

  2. 然后,求 U' = (1/2)(U+UT) 得到一个对称矩阵

  3. 然后,对 U' 进行特征值分解,m x m。

  4. 提取与正特征值相对应的正特征向量,并形成一个矩阵 X,即 m x k

  5. 在 XTX 上执行 SVD 并获得正特征值在 SO(n) 中的 U

  6. 重复步骤 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)
Python 线性代数 SVD 特征向量

评论


答:

0赞 Sauron 9/21/2023 #1
  • 在您需要使用从 np.where 获得的索引来正确提取相应的特征向量。目前,您直接使用索引,这会导致切片不正确。extract_positive_eigenvectors
X = eigenvectors[:, positive_indices[0]]  # for positive eigenvectors
  • 功能相同。extract_negative_eigenvectors
X = eigenvectors[:, negative_indices[0]] # for negative eigenvectors