如何在python中证明SVD | | A-Ak | | 2-范数?
我想用python证明SVD | | A-Ak | | 2-norm=sigma[k+1]如何在python中证明SVD | | A-Ak | | 2-范数?,python,svd,Python,Svd,我想用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
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-范数似乎变化不大,也不等于西格玛[k+1]
我的代码有问题吗,或者我误解了这个定理