《推荐系统笔记(四)》svd的python计算实例

对于任意矩阵 A m × n A_{m\times n} Am×n,根据奇异值分解理论,我们有等式
A = P Σ Q T A=P\Sigma Q^T A=PΣQT

其中, P P P是对称矩阵 A A T AA^T AAT的特征向量组成的 m m m阶方阵, Q Q Q是对称矩阵 A T A A^TA ATA的特征向量组成的 n n n阶方阵, Σ \Sigma Σ是对角线上由 A A A的特征值组成的 m × n m\times n m×n对角矩阵。

现在,我们用scipy的svd来做计算实例。

# 导入第三方库
import numpy as np
from scipy.linalg import svd
# 随意生成一个3*5矩阵
A = np.random.randint(50, size=(3, 5))
array([[ 2, 35,  7, 38, 10],
       [36, 48, 44, 29, 48],
       [10,  9, 25, 41,  8]])
# 对矩阵A做svd分解并打印
p, s, q = svd(A)
print('P矩阵为\n', p)
print(' ')
print('A的特征值为\n', s)
print(' ')
print('Q的转置为\n', q)
P矩阵为
 [[-0.41175322  0.6156175  -0.67191843]
 [-0.8237077  -0.56682763 -0.01456235]
 [-0.38982677  0.5474683   0.74048198]]
 
A的特征值为
 [110.18800362  37.13295888  23.10296999]
 
Q的转置为
 [[-0.31196909 -0.52145217 -0.44352451 -0.50383927 -0.42449372]
 [-0.36894115 -0.01976408 -0.18701407  0.79179427 -0.44897593]
 [ 0.23965483 -0.7597205   0.56996469  0.19064876 -0.06468091]
 [ 0.25901284 -0.36448948 -0.62607977  0.28725845  0.57058432]
 [-0.80127126 -0.13292553  0.22688349 -0.01853266  0.53709925]]

现在,我们可以将 P P P Q Q Q乘回去,看看能否得到原来的矩阵 A A A

P P P Q T Q^T QT已经给出,我们只需要生成对角矩阵 Σ \Sigma Σ

# 生成矩阵sigma
sigma = np.diag(s, 1)[:, 1:]
array([[110.18800362,   0, 0, 0, 0],
       [0,  37.13295888,   0, 0, 0],
       [0, 0,  23.10296999, 0, 0]])
# 计算p*sigma*q,复原矩阵A
p.dot(sigma).dot(q)
array([[ 2., 35.,  7., 38., 10.],
       [36., 48., 44., 29., 48.],
       [10.,  9., 25., 41.,  8.]])
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值