目录
前言
奇异值分解时涉及到特征值分解,而求特征值时要解一个三次方程(三维方阵),因此调用numpy函数直接求出特征值和特征向量,然后求出UVΣ矩阵。
需要调用的包
import numpy as np
提示:以下是本篇文章正文内容,下面案例可供参考
一、输入矩阵
A = np.array([[4, 0, 2 ],
[3, -5, 1],
[2, 1, 3]])
二、求解特征值&特征向量
1.求ATA特征值&特征向量
调用np.linalg.eig()函数求出特征值和特征向量
因为特征值要从大到小排序,因此调用np.argsort()函数对特征值排序,然后根据索引重新排序特征向量。
eigenvalues_ATA, eigenvectors_ATA = np.linalg.eig(np.dot(A.T, A))
sorted_indices_ATA = np.argsort(eigenvalues_ATA)[::-1]
eigenvalues_ATA_sorted = eigenvalues_ATA[sorted_indices_ATA]
eigenvectors_ATA_sorted = eigenvectors_ATA[:, sorted_indices_ATA]
eigenvectors_ATA_sorted = np.round(eigenvectors_ATA_sorted, 4)#保留四位小数
print("ATA特征值:", eigenvalues_ATA_sorted)
print("ATA特征向量:\n", eigenvectors_ATA_sorted)
2.同理求AAT特征值&特征向量
eigenvalues_AAT, eigenvectors_AAT = np.linalg.eig(np.dot(A, A.T))
sorted_indices_AAT = np.argsort(eigenvalues_AAT)[::-1]
eigenvalues_AAT_sorted = eigenvalues_AAT[sorted_indices_AAT]
eigenvectors_AAT_sorted = eigenvectors_AAT[:, sorted_indices_AAT]
eigenvectors_AAT_sorted = np.round(eigenvectors_AAT_sorted, 4)#保留四位小数
print("AAT特征值:", eigenvalues_AAT_sorted)
print("AAT特征向量:\n", eigenvectors_AAT_sorted)
三、求UVΣ矩阵
此处选择k=2
1.U矩阵
U = eigenvectors_ATA_sorted[:, :2]
print("U矩阵:\n", U)
2.V矩阵
V = eigenvectors_AAT_sorted[:, :2]
print("V矩阵:\n", V)
3.Σ矩阵
np.diag()函数是将一个一维数组转换成一个对角矩阵(除主对角线上其余元素都为0的矩阵)
S = np.diag(np.sqrt(eigenvalues_ATA_sorted[:2]))
S = np.round(S, 4) # 保留4位小数
print("Σ矩阵:\n", S)
四、整体代码
import numpy as np
A = np.array([[4, 0, 2], [3, -5, 1], [2, 1, 3]])
eigenvalues_ATA, eigenvectors_ATA = np.linalg.eig(np.dot(A.T, A))
sorted_indices_ATA = np.argsort(eigenvalues_ATA)[::-1]
eigenvalues_ATA_sorted = eigenvalues_ATA[sorted_indices_ATA]
eigenvectors_ATA_sorted = eigenvectors_ATA[:, sorted_indices_ATA]
print("ATA特征值:", eigenvalues_ATA_sorted)
print("ATA特征向量:\n", eigenvectors_ATA_sorted)
eigenvalues_AAT, eigenvectors_AAT = np.linalg.eig(np.dot(A, A.T))
sorted_indices_AAT = np.argsort(eigenvalues_AAT)[::-1]
eigenvalues_AAT_sorted = eigenvalues_AAT[sorted_indices_AAT]
eigenvectors_AAT_sorted = eigenvectors_AAT[:, sorted_indices_AAT]
print("AAT特征值:", eigenvalues_AAT_sorted)
print("AAT特征向量:\n", eigenvectors_AAT_sorted)
print("k=2")
U = eigenvectors_ATA_sorted[:, :2]
print("U矩阵:\n", U)
V = eigenvectors_AAT_sorted[:, :2]
print("V矩阵:\n", V)
S = np.diag(np.sqrt(eigenvalues_ATA_sorted[:2]))
print("Σ矩阵:\n", S)
print("SVD分解结果:")
print(U)
print(S)
print(V.T)
总结
每次只要重新输入矩阵,就可快速得到奇异值SVD分解结果。