SVD-矩陣奇異值分解 —— 原理與幾何意義
來自專欄機器學習知識點
1 簡介
SVD 全稱:Singular Value Decomposition。SVD 是一種提取信息的強大工具,它提供了一種非常便捷的矩陣分解方式,能夠發現數據中十分有意思的潛在模式。
主要應用領域包括:
- 隱性語義分析 (Latent Semantic Analysis, LSA) 或隱性語義索引 (Latent Semantic Indexing, LSI);
- 推薦系統 (Recommender system),可以說是最有價值的應用點;
- 矩陣形式數據(主要是圖像數據)的壓縮。
2 線性變換
在做 SVD 推導之前,先了解一下線性變換,以 的線性變換矩陣為例,先看簡單的對角矩陣:
從集合上講, 是將二維平面上的點 經過線性變換到另一個點的變換矩陣,如下所示:
該變換的幾何效果是,變換後的平面沿著 水平方向進行了3倍拉伸,垂直方向沒有發生變化。
3 SVD 推導
該部分的推導從幾何層面上去理解二維的SVD,總體的思想是:藉助 SVD 可以將一個相互垂直的網格 (orthogonal grid) 變換到另外一個互相垂直的網格。
可以通過二維空間中的向量來描述這件事情。
首先,選擇兩個互相正交的單位向量 和 (也可稱為一組正交基)。
是一個變換矩陣。
向量 也是一組正交向量(也就是 和 經過 變換得到的)。
, 分別是 , 的單位向量(即另一組正交基),且有:
則, 分別為 的模(也稱為 的奇異值)。
設任意向量 ,有:
例如,當 時, .
那麼,可得:
根據線代知識,向量的內積可用向量的轉置來表示:
,則有:
兩邊去掉 ,得:
將下標相同的向量合併起來,則該式可通用地表達為:
至此,SVD 使用幾何意義的形式推導完畢,其中:
- 矩陣的列向量分別是 ;
- 是一個對角矩陣,形如: ;
- 矩陣的列向量分別是 。
關於 SVD 的一些重要的結論性總結:
- 任意的矩陣 是可以分解成三個矩陣;
- 表示了原始域的標準正交基;
- 表示經過 變換後的新標準正交基;
- 表示了 中的向量與 中相對應向量之間的比例(伸縮)關係;
- 中的每個 會按從大到小排好順序,值越大代表該維度重要性越高;
- 在利用 SVD 做數據信息提取或壓縮時,往往依據一些啟發式策略,如直接設定只提取 中的前 項,或者另一種較常用的做法是保留矩陣中一定百分比的能量信息,一般可設定為 90%,能量信息比例的計算可先求得所有奇異值平方總和,然後將奇異值的平方依次累加到總值的 90% 為止,形如: .
4 實現代碼
以下是基於 python 的 numpy 庫實現的 SVD 矩陣分解的代碼,用於實現圖像壓縮的功能。
代碼鏈接 : https://github.com/zlxy9892/ml_code/tree/master/basic_algorithm/svd
# -*- coding: utf-8 -*-import numpy as npimport numpy.linalg as laimport matplotlib.pyplot as pltfrom sklearn import datasetsfrom skimage import iodef getImgAsMat(index): ds = datasets.fetch_olivetti_faces() return np.mat(ds.images[index])def getImgAsMatFromFile(filename): img = io.imread(filename, as_grey=True) return np.mat(img) def plotImg(imgMat): plt.imshow(imgMat, cmap=plt.cm.gray) plt.show()def recoverBySVD(imgMat, k): # singular value decomposition U, s, V = la.svd(imgMat) # choose top k important singular values (or eigens) Uk = U[:, 0:k] Sk = np.diag(s[0:k]) Vk = V[0:k, :] # recover the image imgMat_new = Uk * Sk * Vk return imgMat_new# -------------------- main --------------------- #A = getImgAsMatFromFile(D:/pic.jpg)plotImg(A)A_new = recoverBySVD(A, 30)plotImg(A_new)
這裡用小黃人的大頭照做個例子看看:
原圖:
設置 k = 10,得到的壓縮圖:
k = 20:
k = 30:
繼續增加 k 值,將會得到越來越接近原始圖的壓縮圖。
5 參考資料
- We Recommend a Singular Value Decomposition (AMS 上一篇非常經典的關於SVD幾何意義的介紹)
- 奇異值分解 (SVD) 的幾何意義中文翻譯
推薦閱讀:
※關於網路 URL 地址的編碼
※求均值及索引時Pandas的特性
※Python · 樸素貝葉斯(零)· 簡介
※10min手寫(b四):b寫配置文件生成增刪改查系統
※初學python--認識裝飾器
TAG:機器學習 | Python | 深度學習DeepLearning |