Liam0205 / liam0205.github.io

Deployment of my weblog.
https://liam0205.github.io
35 stars 5 forks source link

谈谈矩阵的 SVD 分解 | 始终 #206

Open Liam0205 opened 5 years ago

Liam0205 commented 5 years ago

https://liam.page/2017/11/22/SVD-for-Human-Beings/

看似高大上的人工智能、机器学习,实际上都脱不开数学的支持。在这些数学内容中,最重要的无疑是两个部分:代数和概率论。我无法在博客中完整地介绍代数(特别是矩阵论)和概率论,但是将其中部分有趣又重要的内容提出来讲解,还是可行的。 此篇,我们谈谈矩阵的 SVD 分解。

muyuuuu commented 1 year ago

提个问。

SVD 分解得到的 U 矩阵特征向量乘以特征向量的转置等于对角阵。

如果 U 矩阵是 [M, N] 的(M个特征向量,N维),我们按照奇异值的重要度选取重要的特征向量,之后的特征向量就是 [M, K]。然后 [M, K] 的矩阵乘以自己的转置,得到 [M, M] 的矩阵

最后这个 [M, M] 的矩阵,为啥行和列的和近似为 1 呢?代码如下:

from PIL import Image
import numpy as np

img = Image.open("2.jpg").convert("L")
arr = np.array(img) / 255

U, S, Vh = np.linalg.svd(arr, full_matrices=False)

sval_total = (S**2).sum()
sval_ratio = (S**2)/sval_total

r = np.sum(np.cumsum(sval_ratio) < 0.95)

tmp = U[:, 0:r]

arr = np.dot(tmp, tmp.T)

print(np.sum(arr, 0))
print(np.sum(arr, 1))