李宏毅线性代数笔记13:SVD分解
1 SVD分解介紹
????????之前用特征值來進行對角化的時候,被對角化的矩陣一定要是方陣,但是SVD的話,非方陣也是可以的。
?矩陣Σ對角線上的元素都是大于等于0的
我們可以改變U,V的一些行和列,來達到Σ對角線上的元素越來越小
?所以rank(A)就是Σ中對角線元素不為零的數量
?如果把Σ中全零的部分抹掉,然后U和V中全零對應的行和列也去掉,那么乘積結果還是等于A
?????????如果我們多抹掉一些(比如多抹掉一行),把Σ中非零的一部分也抹掉了,結果肯定不等于A了,但是是所有rank為k-1的部分中最接近于A的,接近的意思是兩個矩陣相減的結果拉成一條向量,這個向量的norm最小
2 SVD的應用:圖像壓縮
2.1可以用小一點的維度來復原一張相似的圖
2.1 SVD分解的應用2:文檔-詞項矩陣的奇異值分解
參考了?奇異值分解的揭秘(二):降維與奇異向量的意義 - 知乎 (zhihu.com)
????????給定一個大小為7×5的矩陣A,A的前4行表示來源于CS的文檔,后3行表示來源于醫學(MD)的文檔,A的各列分別對應著5個單詞,在矩陣中,每個元素的數值表示單詞在相應文檔中出現的頻數。
?我們使用numpy 對其進行SVD分解
import numpy as np A = [[1, 1, 1, 0, 0], [2, 2, 2, 0, 0], [1, 1, 1, 0, 0], [5, 5, 5, 0, 0], [0, 0, 0, 2, 2], [0, 0, 0, 3, 3], [0, 0, 0, 1, 1]] [U, s, v] = np.linalg.svd(A) [U, s, v]''' [[-0.1796053 , 0. , 0.97298719, -0.07270854, -0.05034883,-0.10906282,-0.03635427],[-0.3592106 , 0. , 0.05552004, 0.49265053, -0.13571796,0.73897579, 0.24632526],[-0.1796053 , 0. , 0.02776002, 0.03887713, 0.98065351,0.05831569, 0.01943856],[-0.89802651, 0. , -0.22235746, -0.19029393, -0.13177375,-0.28544089,-0.09514696],[ 0. , -0.53452248, 0. , 0.71428571, 0. ,-0.42857143,-0.14285714],[ 0. , -0.80178373, 0. , -0.42857143, 0. ,0.35714286, -0.21428571],[ 0. , -0.26726124, 0. , -0.14285714, 0. ,-0.21428571,0.92857143]]),[9.64365076e+00, 5.29150262e+00, 7.52989891e-16, 0.00000000e+00,0.00000000e+00]),array([[-0.57735027, -0.57735027, -0.57735027, -0. , -0. ],[-0. , -0. , -0. , -0.70710678, -0.70710678],[ 0.81649658, -0.40824829, -0.40824829, 0. , 0. ],[ 0. , 0. , 0. , -0.70710678, 0.70710678],[ 0. , -0.70710678, 0.70710678, 0. , 0. ]])] '''?奇異值主要是前兩項,所以我們使用前兩項的U,V矩陣和對應的奇異值對齊進行近似
U[:,:2] @ np.diag(s[:2]) @ v[:2,:] ''' array([[1., 1., 1., 0., 0.],[2., 2., 2., 0., 0.],[1., 1., 1., 0., 0.],[5., 5., 5., 0., 0.],[0., 0., 0., 2., 2.],[0., 0., 0., 3., 3.],[0., 0., 0., 1., 1.]]) '''近似結果和原來的是一樣的?
?????????我們可以很明顯地發現,左右奇異向量u和v已經有了明顯的語義信息:第一行/列 表示的內容是CS 相關的? ,第二行/列 表示的內容是MD相關的。? ? ??
?????????此時,我們使用第一行V,第一列U和第一個奇異值就可以得到CS相關的特征矩陣;使用第二行V,第二列U和第二個奇異值就可以得到MD相關的特征矩陣
U[:,:1] @ np.diag(s[:1]) @ v[:1,:] ''' array([[1., 1., 1., 0., 0.],[2., 2., 2., 0., 0.],[1., 1., 1., 0., 0.],[5., 5., 5., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.]]) ''' U[:,1:2] @ np.diag(s[1:2]) @ v[1:2,:] ''' array([[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 0., 0.],[0., 0., 0., 2., 2.],[0., 0., 0., 3., 3.],[0., 0., 0., 1., 1.]]) '''?3 SVD求解
?這里中間的和可以消掉,是因為V和U是正交矩陣
和都是對稱矩陣,那么我們就可以對其進行特征值分解(要變成標準正交基的那種,也就是特征值分解了之后,還要對特征空間的基進行施密特正交化)
然后Σ對角線的值就是或的特征值的開方
總結
以上是生活随笔為你收集整理的李宏毅线性代数笔记13:SVD分解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ok】李宏毅机器学习12: 对称矩阵
- 下一篇: 李宏毅线性代数总结:万事万物皆可为向量