问题描述
我想在python中证明SVD || A-Ak || 2-norm = sigma [k + 1]。
import numpy as np
from PIL import Image
origin_path = 'cat_black.jpg'
def restore(sigma,u,v,K):
m = len(u)
n = len(v[0])
a = np.zeros((m,n))
for k in range(K):
uk = u[:,k].reshape(m,1)
vk = v[k].reshape(1,n)
a += sigma[k] * np.dot(uk,vk)
a = a.clip(0,255)
print('Sigma K = ',sigma[k])
return np.rint(a).astype('uint8')
def norm(origin_array,processed_array):
return np.linalg.norm((origin_array - processed_array),ord = 2)
if __name__ == "__main__":
img_origin = Image.open(origin_path,'r')
img_gray = img_origin.convert("L")
A = np.array(img_gray)
u_r,sigma_r,v_r = np.linalg.svd(A)
K = 50
for k in range(1,K+1):
Ak = restore(sigma_r,u_r,v_r,k)
print('norm = ',norm(A,Ak))
结果:
Sigma K = 17206.473910342025
norm = 30655.405160130085
Sigma K = 3315.568979796393
norm = 30795.891622390798
Sigma K = 3286.1767824148383
norm = 29256.410859161282
Sigma K = 2368.9751805522765
norm = 28037.018637931258
Sigma K = 2230.517905068977
norm = 27435.34881148788
Sigma K = 2039.0906629046
norm = 27194.777474480212
Sigma K = 1660.6421395853733
norm = 27496.436013057115
Sigma K = 1383.1582873683822
norm = 27518.02199879641
Sigma K = 1248.8586449917684
norm = 26620.47323212858
.......
结果与预期不符, 2范数似乎变化不大,并且不会等于sigma [k + 1] 我的代码是否有问题,或者我误解了该定理?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)