如何在python中证明SVD || A-Ak || 2-norm?

问题描述

我想在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 (将#修改为@)