svd分解和svd近似

SVD近似:
M m ⋅ n ≈ U m ⋅ k S k ⋅ k ( V T ) k ⋅ n M_{m·n}≈U_{m·k}S_{k·k}(V^T)_{k·n} MmnUmkSkk(VT)kn

SVD分解:
M m ⋅ n ≈ U m ⋅ m S m ⋅ n ( V T ) n ⋅ n M_{m·n}≈U_{m·m}S_{m·n}(V^T)_{n·n} MmnUmmSmn(VT)nn

代码如下:
代码的前半部分是svd近似,代码的后半部分是svd分解
前半部分的svd近似中,k=min(m,n)

#-*- coding:utf-8 -*-
import sys
reload(sys)
from numpy import *
import numpy as np
sys.setdefaultencoding("utf-8")

data = mat([[1,2,3,4,5,6,7,8,9],
                [5,6,7,8,9,0,8,6,7],
                [9,0,8,7,1,4,3,2,1],
                [6,4,2,1,3,4,2,1,5]])
print"data的维度:",np.shape(data)
U,sigma,VT = np.linalg.svd(data,full_matrices=False)
print"-----------------1-U----------------------"
print U
print np.shape(U)
print"-----------------1-Σ-----------------------"
print sigma
print np.shape(sigma)
print"------------------1-VT---------------------"
print VT
print np.shape(VT)
print"##########################################################"
print"------------------2-U---------------------"
U,sigma,VT = np.linalg.svd(data,full_matrices=True)
print U
print np.shape(U)
print"-------------------2---------------------"
print sigma
print np.shape(sigma)
print"-------------------2-VT--------------------"
print VT
print np.shape(VT)

##############################################################
那么如果想指定k值怎么办呢?

#-*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from scipy import sparse,stats
import numpy as np
from numpy import *
from math import *
n,m = (4,3)
print("------------------------------")
A=np.asarray([ [1,2,3,4,5,6,7,8,9],
                  [5,6,7,8,9,0,8,6,7],
                  [9,0,8,7,1,4,3,2,1],
                  [6,4,2,1,3,4,2,1,5]]).astype(float)
print("------------------------------")
print(type(A))
u,d,vt = np.linalg.svd(A,full_matrices=0)
k=2
u,d,vt = u[:,:k],d[:k],vt[:,:k]
print("------U-----")
print(u)
print("------S-----")
print(d)
print("------VT-----")
print(vt)

print("--------------------------下面是svd近似-----------------------------------------------------")
 
u,d,vt = sparse.linalg.svds(A,k)

u,d,VT = u[:,::-1],d[::-1],vt[::-1,:]
#::-1表示翻转
print("------U-----")
print(u)
print("------S-----")
print(d)
print("------VT-----")
print(VT)

如果想通过计算svd结果来恢复原来的矩阵咋办?
注意需要把S处理成对角阵才能恢复成最初的矩阵。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值