奇异值分解的Python代码

目录

前言

一、输入矩阵

二、求解特征值&特征向量

1.求ATA特征值&特征向量

2.同理求AAT特征值&特征向量

三、求UVΣ矩阵

1.U矩阵

2.V矩阵

3.Σ矩阵

四、整体代码

总结


前言

奇异值分解时涉及到特征值分解,而求特征值时要解一个三次方程(三维方阵),因此调用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分解结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值