30分鐘學會SVD矩陣分解

2022-01-30 算法美食屋
SVD(Singular Value Decomposition)奇異值分解分解是機器學習中最重要的矩陣分解方法。

它能夠將一個任意形狀的矩陣分解成一個正交矩陣和一個對角矩陣以及另一個正交矩陣的乘積。

SVD分解具有非常深刻的幾何含義。矩陣實際上對應著一種線性變換,一個矩陣作用到一個向量上,會得到一個新的向量。任何一個矩陣的操作效果可以分解成一次旋轉,一次拉伸和維度改變,以及另外一次旋轉三者作用效果的合成。

SVD分解通常用於數據壓縮和數據降維。用於數據降維時,既可以對列降維,也可以對行降維,其中對列的降維等價於PCA的降維。

不僅如此,SVD算法還可以用於在聲音和圖像處理中剝離背景信號,在推薦算法中也經常出現它的身影。

公眾號後臺回復關鍵字: 源碼,獲取本文全部代碼和對應插圖PPT。

一,SVD矩陣分解簡介

SVD分解將任意矩陣分解成一個正交矩陣和一個對角矩陣以及另一個正交矩陣的乘積。

對角矩陣的對角元稱為矩陣的奇異值,可以證明,奇異值總是大於等於0的。

當對角矩陣的奇異值按從大到小排列時,SVD分解是唯一的。

SVD分解有著非常深刻的幾何含義。

矩陣實際上是對應著一種線性變換。一個矩陣作用到一個向量上,會得到一個新的向量。任何一個矩陣的操作效果可以分解成一次旋轉,一次拉伸和維度改變,以及另外一次旋轉三者作用效果的合成。

注意正交矩陣和作用到向量後是不會改變向量長度的,所以對應著旋轉變換。

二,SVD分解的數學推演

 可以推出

依然是對角矩陣,又U為正交矩陣。

所以 為AA^T的相似對角矩陣,其對角元為AA^T的特徵值,U由其對應特徵向量構成,這些向量稱為A的左奇異向量。

因此的對角元為AA^T特徵值的平方根,稱之為矩陣A的奇異值。

類似地V由A^TA的特徵向量構成,這些向量稱為A的右奇異向量。

三,SVD分解和數據壓縮

奇異值描述了矩陣對應的拉伸變換在各個方向的比例,是矩陣的重要特徵。

奇異值的分布通常非常不均,在很多的情況下前10%甚至1%的奇異值之和就佔了全部奇異值之和的99%以上。

因此我們可以用前個大的奇異值來近似的描述矩陣。

這就是SVD分解用來進行數據壓縮的原理。

假設 m = 10000,n = 8000,原來存儲矩陣A需要存儲8000萬個數字,如果經過奇異值分解發現前100個奇異值貢獻了99%的奇異值之和,於是可以近似只保留這100個奇異值及對應的左右奇異向量,那麼只需要保留100+10000×100+100×8000= 180.01萬個數字,只有原來的不到2.3%。

# 下面的範例示範SVD分解用於圖片數據壓縮。
%matplotlib inline 
%config InlineBackend.figure_format = 'svg'
import numpy as np 
from matplotlib import pyplot as plt
from skimage import data

def compressBySVD(img,r):
    u,s,vt = np.linalg.svd(img)
    ur = u[:,0:r]
    sr = s[0:r]
    vtr = vt[0:r,:]
    return (ur,sr,vtr)

def rebuildFromSVD(ur,sr,vtr):
    img = ur@np.diag(sr)@vtr
    return(img)


img = data.camera()/255.0

plt.figure(figsize=(10,8)) 
for i,r in enumerate([5,10,20,30,40,50,100,200],start = 1):
    ur,sr,vtr = compressBySVD(img,r)
    compress_ratio = (np.product(ur.shape) + len(sr) + 
                      np.product(vtr.shape))/np.product(img.shape)
    img_rebuild = rebuildFromSVD(ur,sr,vtr)
    ax=plt.subplot(3,3,i)
    ax.imshow(img_rebuild,cmap = "gray")
    ax.set_title("r=%d"%r+", compress_ratio=%.2f"%compress_ratio)
    ax.set_xticks([])
    ax.set_yticks([]) 

ax = plt.subplot(3,3,9)
ax.imshow(img,cmap = "gray")
ax.set_title("r = 512, original image")
ax.set_xticks([])
ax.set_yticks([]) 

plt.show()




四,SVD分解和PCA降維

PCA降維可以看成是SVD分解的一個應用。PCA降維使用的變換矩陣恰好是SVD分解的右奇異矩陣。

實際上,由於SVD分解存在著無需通過計算特徵值和特徵向量的可並行的數值迭代計算算法,sklearn的PCA降維算法正是通過SVD分解計算的。

下面證明SVD分解的右奇異向量構成的矩陣恰好是PCA算法所需要的正交變換矩陣。

假定PCA對應的正交變換矩陣為,根據PCA算法的數學原理,

由協方差矩陣 的各個特徵向量組成,它能夠將協方差矩陣相似對角化。

其中為的相似對角矩陣,且對角元由大到小排列。

利用的SVD矩陣分解:

我們有

根據SVD分解的數學原理,也是 的相似對角矩陣,且對角元由大到小排列。

於是有:

於是右奇異向量構成的矩陣 𝑉 恰好是PCA算法所需要的正交變換矩陣 𝑊。

注意到PCA算法實際上是一種列降維的方法,實際上利用SVD分解的左奇異矩陣也可以對矩陣進行行降維。

# 演示SVD用於PCA降維的計算

%matplotlib inline 
%config InlineBackend.figure_format = 'svg'
import numpy as np 
from sklearn.decomposition import PCA

from matplotlib import pyplot as plt
from skimage import data

X = np.array([[-1.0, -3, -2], [-2, -1, -3], [-3, -2, -5], [2, 1, 3], [6, 1, 3], [2, 2, 3]])

pca = PCA(n_components= 2)
X_new = pca.fit_transform(X)
print("\ndecomposition by pca:")
print("singular value:")
print(pca.singular_values_)
print("X_new:")
print(X_new)

print("\ndecomposition by svd:")
U,S,Vt = np.linalg.svd(X-X.mean(axis = 0))
print("singular value:\n",S[:2])
print("X_new:")
print(np.dot(X-X.mean(axis = 0),np.transpose(Vt)[:,0:2]))

# 註:降維結果中正負號的差異是因為PCA調整了SVD分解後的U和Vt符號以保持各列最大值取正

輸出如下:

decomposition by pca:
singular value:
[11.31375337  2.89544001]
X_new:
[[ 3.23378083  1.06346839]
 [ 3.88607412 -0.50763321]
 [ 6.25267378  0.08479886]
 [-3.50509914 -0.96584476]
 [-6.02398361  1.89494314]
 [-3.84344598 -1.56973242]]

decomposition by svd:
singular value:
 [11.31375337  2.89544001]
X_new:
[[-3.23378083 -1.06346839]
 [-3.88607412  0.50763321]
 [-6.25267378 -0.08479886]
 [ 3.50509914  0.96584476]
 [ 6.02398361 -1.89494314]
 [ 3.84344598  1.56973242]]

公眾號後臺回復關鍵字: 源碼,獲取本文全部代碼和對應插圖PPT。

相關焦點

  • 精簡易懂,30 分鐘學會 SVD 矩陣分解,很強!
    它能夠將一個任意形狀的矩陣分解成一個正交矩陣和一個對角矩陣以及另一個正交矩陣的乘積。SVD分解具有非常深刻的幾何含義。矩陣實際上對應著一種線性變換,一個矩陣作用到一個向量上,會得到一個新的向量。任何一個矩陣的操作效果可以分解成一次旋轉,一次拉伸和維度改變,以及另外一次旋轉三者作用效果的合成。
  • 太巧妙了: 實際跑的 SVD 分解原來是這樣實現的
    1引言調用 sklearn 裡的 PCA,你可能會發現有個參數 svd_solver 可以設置 svd_solver = 'randomized'。這裡的隨機是什麼意思呢?如果用默認設置 'auto' 的話,那麼會根據矩陣大小自動選擇求解器。
  • 數學推導+純Python實現機器學習算法28:奇異值分解SVD
    (Singular Value Decomposition,SVD)作為一種常用的矩陣分解和數據降維方法,在機器學習中也得到了廣泛的應用,比如自然語言處理中的SVD詞向量和潛在語義索引,推薦系統中的特徵分解,SVD用於PCA降維以及圖像去噪與壓縮等。
  • 奇異值分解(SVD)
    奇異值分解能夠簡約數據,去除噪聲和冗餘數據。其實它說白了也是一種降維方法,將數據映射到低維空間。看到這裡其實就會想,它和主成分分析(PCA)有什麼聯繫或者差異呢?奇異值分解和主成分分析一樣,也是告訴我們數據中重要特徵,奇異值是數據矩陣乘以該矩陣的轉置的特徵值的平方根(Data*Data^T特徵值的平方根)。
  • 從奇異值分解 SVD 看 PCA 的主成分
    .特徵分解由於協方差矩陣是一個半正定對稱矩陣,因此我們可以對它作特徵分解,.奇異值分解我們也可以用奇異值分解來計算 PC,但不是分解協方差矩陣,而是分解特徵矩陣。 SVD 分解U, Sigma, VT = np.linalg.svd(X, full_matrices=False)U.shape, Sigma.shape, VT.shape((150, 4), (4,), (4, 4))由於上面我們設置參數 full_matrices=False,所以得到的矩陣
  • 數據科學中需要知道的5個關於奇異值分解(SVD)的應用
    奇異值分解(SVD)的應用我們將在此處遵循自上而下的方法並首先討論SVD應用。如果你對它如何工作感興趣的,我在下面會講解SVD背後的數學原理。現在你只需要知道四點來理解這些應用:SVD是將矩陣A分解為3個矩陣--U,S和V。S是奇異值的對角矩陣。
  • 數據降維 SVD 分解 小案例
    Aarray([[2, 1, 0],       [4, 3, 0]])調用 Numpy中的奇異值分解API:#奇異值分解np.linalg.svd(A)得到的結果為三個數組 USigmaV轉置(array([[-0.40455358, -0.9145143
  • 強大的矩陣奇異值分解(SVD)及其應用
    在上篇文章中便是基於特徵值分解的一種解釋。特徵值和奇異值在大部分人的印象中,往往是停留在純粹的數學計算中。而且線性代數或者矩陣論裡面,也很少講任何跟特徵值與奇異值有關的應用背景。奇異值分解是一個有著很明顯的物理意義的一種方法,它可以將一個比較複雜的矩陣用更小更簡單的幾個子矩陣的相乘來表示,這些小矩陣描述的是矩陣的重要的特性。
  • 一文讀懂機器學習中奇異值分解SVD
    矩陣分解1.1 矩陣分解作用1.2 矩陣分解的方法一文讀懂機器學習中奇異值分解SVD1.3 推薦學習的經典矩陣分解算法SVD具體介紹2.1 特徵值、特徵向量、特徵值分解2.2 SVD分解2.3 SVD分解的應用1.
  • PCA SVD原理詳解及應用
    ,變成的新維度,該維度與原始矩陣相比,行數不變,列數降維到N,但卻保留了原始矩陣所蘊含的大部分信息reconMat就是我們用lowDDataMat來重構回原始矩陣,為什麼會是這樣呢?,而下面介紹的svd正是直接對不是方陣的情況進行分解。
  • 人工智慧的數學(1)奇異值分解
    在數據分析的過程中,當原數據排成的矩陣規模較大時,通過奇異值分解,可將其分為左奇異矩陣、奇異值矩陣、右奇異矩陣,三個較小的矩陣,便於儲存和傳輸。同時奇異值分解也便於進行對矩陣的數值運算的近似操作。奇異值分解的英文是Singular Value Discomposition,也就是通常說的SVD。
  • 奇異值分解SVD
    奇異值分解(SVD)在計算機視覺中有著廣泛的應用,如數據降維、推薦系統、自然語言處理等。本文是介紹SVD的數學計算過程,並從SVD的性質說明其應用的原理。奇異值分解(SVD)與特徵分解類似,是將矩陣分解為由奇異值(特徵值)和特徵向量表示的矩陣之積的方法。因而,在介紹SVD前有必要先介紹特徵值、特徵向量和特徵分解。
  • 圖像特徵提取學習筆記 | 使用低秩 SVD 的圖像壓縮實例!
    最近關注尋找一些非典型算法嘗試從一幅圖像中提取一些特徵用於機器學習分類,看到Mathworks公司主頁上的這個實例,深受啟發,也許從圖像對應的矩陣分解理論能適當地降維待處理的圖像數據並抽取有意義的特徵用於基於圖神經網絡的分類研究。轉發於此,備忘!
  • 奇異值分解(SVD)原理
    一般會把W的這n個特徵向量標準化,即滿足||wi||^2=1, 或者說wi^Twi=1,此時W的n個特徵向量為標準正交基,滿足W^TW=I,即W^T=W^−1, 也就是說W為酉矩陣。這樣特徵分解表達式可以寫成A=WΣW^T注意到要進行特徵分解,矩陣A必須為方陣。
  • 奇異值分解及其應用
    奇異值分解是一個有著很明顯的物理意義的一種方法,它可以將一個比較複雜的矩陣用更小更簡單的幾個子矩陣的相乘來表示,這些小矩陣描述的是矩陣的重要的特性。不過,特徵值分解也有很多的局限,比如說變換的矩陣必須是方陣。奇異值下面談談奇異值分解。特徵值分解是一個提取矩陣特徵很不錯的方法,但是它只是對方陣而言的,在現實的世界中,我們看到的大部分矩陣都不是方陣,比如說有N個學生,每個學生有M科成績,這樣形成的一個N * M的矩陣就不可能是方陣,我們怎樣才能描述這樣普通的矩陣呢的重要特徵呢?
  • 奇異值分解(SVD) 的幾何意義
    上角標 T 表示矩陣 V 的轉置。這就表明任意的矩陣 M 是可以分解成三個矩陣。這樣我們就把尋找矩陣的奇異值分解過程縮小到了優化函數|Mx|上了。結果發現(具體的推到過程這裡就不詳細介紹了)這個函數取得最優值的向量分別是矩陣 MT M 的特徵向量。由於MTM是對稱矩陣,因此不同特徵值對應的特徵向量都是互相正交的,我們用vi 表示MTM的所有特徵向量。
  • 降維方法(二)---SVD
    SVD不僅是一個數學問題,在工程應用中的很多地方都有它的身影,比如前面講的PCA,PCA的實現一般有兩種,一種是之前文章提到的用特徵值分解去實現的
  • 奇異值分解(SVD) 的 幾何意義
    這樣我們就把尋找矩陣的奇異值分解過程縮小到了優化函數|Mx|上了。結果發現(具體的推到過程這裡就不詳細介紹了)這個函數取得最優值的向量分別是矩陣 MT M 的特徵向量。由於MTM是對稱矩陣,因此不同特徵值對應的特徵向量都是互相正交的,我們用vi 表示MTM的所有特徵向量。奇異值σi = |Mvi| , 向量 ui 為Mvi 方向上的單位向量。但為什麼ui也是正交的呢?
  • 奇異值分解(SVD)原理總結
    是M*K的矩陣,需要擴展成方陣形式:將正交基是M*N對角矩陣,V是N*N方陣因此(3.4)式寫成向量形式為:在(4.2)式對列進行了降維,即右奇異矩陣V可以用於列數的壓縮,與PCA降維算法一致。是描述樣本數據間相關關係的矩陣,因此,左奇異矩陣U是以樣本空間進行展開,原理與列降維一致,這裡不詳細介紹了 。若我們選擇前r個特徵值來表示原始數據集,數據集A在樣本空間展開為:
  • 經典 | 奇異值分解(SVD) 的 幾何意義
    上角標 T 表示矩陣 V 的轉置。這就表明任意的矩陣 M 是可以分解成三個矩陣。如何獲得奇異值分解?( How do we find the singular decomposition? )事實上我們可以找到任何矩陣的奇異值分解,那麼我們是如何做到的呢?假設在原始域中有一個單位圓,如下圖所示。