\(A\) 爲 \(m \times n\) 實矩陣, 記 SVD 的通常形式爲python
\[A = U\Sigma V',\]spa
其中 \(U=(u_1,\dots,u_m)\), \(V=(v_1,\dots,v_n)\) 爲正交陣,code
\[ \Sigma = \begin{pmatrix} S & O\\ O & O \end{pmatrix},\quad\text{where $S = {\rm diag}\{\sigma_1,\dots,\sigma_r\}$ }, \]component
\(\sigma_1\ge\dots\sigma_r> 0\) 是 \(A\) 的非零奇異值.blog
\(\sigma_j\) 越大意味着對應的 \(A'A\) 的特徵值 \(\sigma_j^2\) 越大, 從而其主成分 (principal component) \(Av_j\) 的樣本方差越大, 咱們把方差大視爲提供了更多信息.ip
\(A\) 可寫爲ci
\[ A = \sum_{k=1}^r \sigma_r u_kv_k', \]element
把帶有較少信息的小的奇異值扔掉便達到了壓縮 (減小須要存儲的東西) 的目的.數學
import numpy as np from numpy.linalg import svd from PIL import Image import matplotlib.pyplot as plt path = r'Lenna_(test_image).png' image = Image.open(path) image = np.array(image) print(np.shape(image)) plt.imshow(image)
(512, 512, 3)it
3 表示 RGB 各有一個矩陣, 下面分別對 RGB 作 SVD.
# 保留前 k 個奇異值 def compression(image, k): image2 = np.zeros_like(image) for i in range(image.shape[2]): U, S, Vt = svd(image[:,:,i]) image2[:,:,i] = U[:,:k].dot(np.diag(S[:k])).dot(Vt[:k,:]) plt.imshow(image2) plt.title('k = %s' % k) plt.figure(figsize=(20,10)) k = image.shape[0]/2 for i in range(8): k = int(k/2) pos = 241+i plt.subplot(pos) compression(image, k)
[1] 姚慕生, 吳泉水, 謝啓鴻. (2014). 高等代數學 (第三版) (pp. 414-416). 上海: 復旦大學出版社.
[2] Friedman, J., Hastie, T., & Tibshirani, R. (2001). The elements of statistical learning (pp. 62). New York: Springer series in statistics.