寻找矩阵的极分解

0 投票
1 回答
47 浏览
提问于 2025-04-13 14:26

我正在尝试找到一个矩阵的极分解方法。
我看了一个视频讲座来学习这个内容:https://www.youtube.com/watch?v=VjBEFOwHJoo
我试着按照他们的方法来实现,信任他们计算的特征值和特征向量,下面的结果显示我得到了正确的 UP 矩阵。

A = np.array([[4,-14,1],[22,23,18],[15,10,20]])
A_T_multiply_A = np.array(A.T @ A)
print("A transpose into A")
print(A_T_multiply_A)


x = np.array([[-1,1,1],[0,-2,1],[1,1,1]])           # Eigen vectors
y = np.array([[25,0,0],[0,225,0],[0,0,2025]])      # Eigen values
z = np.linalg.inv(np.array([[-1,1,1],[0,-2,1],[1,1,1]]))    # Inverse Eigen vectors
A_transpose_A = x @ y @ z
print("A transpose A by multiplying Eigen vectors, Eigen values and Inv of Eigen vectors")
print(A_transpose_A)  
P  = x @ np.sqrt(y) @ z
print("Matrix P")
print(P)
U = A @ np.linalg.inv(P)
print("Matrix U")
print(U)

但是,当我尝试使用numpy的API来实现特征向量和特征值时,结果却不一致:

import numpy as np

# Define the matrix
A = np.array([[4,-14,1],
              [22,23,18],
              [15,10,20]])
A_T_multiply_A = np.array(A.T @ A)

# Compute eigenvalues and eigenvectors
eigenvalues, eigenvectors = np.linalg.eig(A_T_multiply_A)

# Print the results
print("Eigenvalues:")
print(eigenvalues)

print("\nEigenvectors:")
print(eigenvectors)

我不太明白为什么会有这样的差异?如果有人能给我解释一下或者提供一些好的链接,那就太好了。

我使用numpy得到的特征值和特征向量的值是:

   Eigenvalues:
[2025.   25.  225.]

Eigenvectors:
[[-5.77350269e-01 -7.07106781e-01  4.08248290e-01]
 [-5.77350269e-01 -3.91901695e-16 -8.16496581e-01]
 [-5.77350269e-01  7.07106781e-01  4.08248290e-01]]

另外,我还提供了使用numpy API计算极分解的Python代码。

    import numpy as np
    from scipy.linalg import polar
    A = np.array([[4,-14,1],[22,23,18],[15,10,20]])
    U, P = polar(A)
    print("Matrix U=")
    print(U)
    print("Matrix P=")
    print(P)

结果是:

Matrix U=
[[ 6.00000000e-01 -8.00000000e-01  2.40023768e-16]
 [ 8.00000000e-01  6.00000000e-01  3.21346710e-16]
 [ 2.32191141e-16  6.61562711e-17  1.00000000e+00]]
Matrix P=
[[20. 10. 15.]
 [10. 25. 10.]
 [15. 10. 20.]]

1 个回答

0

这里有一个使用 svd 的解决方案:

import numpy as np

vecU, vals, vecV = np.linalg.svd(A)

P = vecV.T @ np.diag(vals) @ vecV
U = vecU @ vecV
P
array([[20., 10., 15.],
       [10., 25., 10.],
       [15., 10., 20.]])
U
array([[ 6.00000000e-01, -8.00000000e-01,  5.73090676e-16],
       [ 8.00000000e-01,  6.00000000e-01,  3.76857861e-16],
       [ 2.32191141e-16, -5.92653245e-17,  1.00000000e+00]])

把这个结果和你已有的结果对比一下,你会发现它们是一样的。


这是一个使用特征分解(Eigen decomposition)的解决方案:

Evals, Evec = np.linalg.eig(A.T @ A)
P = Evec @ np.diag(np.sqrt(Evals)) @ Evec.T
U = A @ Evec @ np.diag(1/np.sqrt(Evals)) @ Evec.T

P
array([[20., 10., 15.],
       [10., 25., 10.],
       [15., 10., 20.]])
U
array([[ 6.00000000e-01, -8.00000000e-01,  3.33066907e-16],
       [ 8.00000000e-01,  6.00000000e-01, -2.63677968e-16],
       [-9.71445147e-16, -1.66533454e-16,  1.00000000e+00]])

撰写回答