复现经典:《统计学习方法》第15章 奇异值分解
第15章 奇異值分解
本文是李航老師的《統(tǒng)計學(xué)習(xí)方法》一書的代碼復(fù)現(xiàn)。作者:黃海廣
備注:代碼都可以在github中下載。我將陸續(xù)將代碼發(fā)布在公眾號“機器學(xué)習(xí)初學(xué)者”,可以在這個專輯在線閱讀。
1.矩陣的奇異值分解是指將實矩陣表示為以下三個實矩陣乘積形式的運算
其中是階正交矩陣,是階正交矩陣,是矩形對角矩陣
其對角線元素非負(fù),且滿足
2.任意給定一個實矩陣,其奇異值分解一定存在,但并不唯一。
3.奇異值分解包括緊奇異值分解和截斷奇異值分解。緊奇異值分解是與原始矩陣等秩的奇異值分解,截斷奇異值分解是比原始矩陣低秩的奇異值分解。
4.奇異值分解有明確的幾何解釋。奇異值分解對應(yīng)三個連續(xù)的線性變換:一個旋轉(zhuǎn)變換,一個縮放變換和另一個旋轉(zhuǎn)變換第一個和第三個旋轉(zhuǎn)變換分別基于空間的標(biāo)準(zhǔn)正交基進(jìn)行。
5.設(shè)矩陣的奇異值分解為,則有
即對稱矩陣和的特征分解可以由矩陣的奇異值分解矩陣表示。
6.矩陣的奇異值分解可以通過求矩陣的特征值和特征向量得到:的特征向量構(gòu)成正交矩陣的列;從的特征值的平方根得到奇異值,即
對其由大到小排列,作為對角線元素,構(gòu)成對角矩陣;求正奇異值對應(yīng)的左奇異向量,再求擴充的的標(biāo)準(zhǔn)正交基,構(gòu)成正交矩陣的列。
7.矩陣的弗羅貝尼烏斯范數(shù)定義為
在秩不超過的矩陣的集合中,存在矩陣的弗羅貝尼烏斯范數(shù)意義下的最優(yōu)近似矩陣。秩為的截斷奇異值分解得到的矩陣能夠達(dá)到這個最優(yōu)值。奇異值分解是弗羅貝尼烏斯范數(shù)意義下,也就是平方損失意義下的矩陣最優(yōu)近似。8.任意一個實矩陣可以由其外積展開式表示
其中為矩陣,是列向量和行向量的外積,為奇異值,通過矩陣的奇異值分解得到。任意一個 x 矩陣,都可以表示為三個矩陣的乘積(因子分解)形式,分別是階正交矩陣,由降序排列的非負(fù)的對角線元素組成的 x 矩形對角矩陣,和階正交矩陣,稱為該矩陣的奇異值分解。矩陣的奇異值分解一定存在,但不唯一。
奇異值分解可以看作是矩陣數(shù)據(jù)壓縮的一種方法,即用因子分解的方式近似地表示原始矩陣,這種近似是在平方損失意義下的最優(yōu)近似。
矩陣的奇異值分解是指,將一個非零的 x 實矩陣表示為一下三個實矩陣乘積形式的運算:
,
其中 是 階正交矩陣, 是 階正交矩陣, 是由降序排列的非負(fù)的對角線元素組成的 x 矩形對角矩陣。稱為 的奇異值分解。的列向量稱為左奇異向量, 的列向量稱為右奇異向量。
奇異值分解不要求矩陣 是方陣,事實上矩陣的奇異值分解可以看作方陣的對角化的推廣。
緊奇奇異值分解是與原始矩陣等秩的奇異值分解, 截斷奇異值分解是比原始矩陣低秩的奇異值分解。
#?實現(xiàn)奇異值分解,?輸入一個numpy矩陣,輸出?U,?sigma,?V #?https://zhuanlan.zhihu.com/p/54693391import?numpy?as?np#基于矩陣分解的結(jié)果,復(fù)原矩陣 def?rebuildMatrix(U,?sigma,?V):a?=?np.dot(U,?sigma)a?=?np.dot(a,?np.transpose(V))return?a#基于特征值的大小,對特征值以及特征向量進(jìn)行排序。倒序排列 def?sortByEigenValue(Eigenvalues,?EigenVectors):index?=?np.argsort(-1?*?Eigenvalues)Eigenvalues?=?Eigenvalues[index]EigenVectors?=?EigenVectors[:,?index]return?Eigenvalues,?EigenVectors#對一個矩陣進(jìn)行奇異值分解 def?SVD(matrixA,?NumOfLeft=None):#NumOfLeft是要保留的奇異值的個數(shù),也就是中間那個方陣的寬度#首先求transpose(A)*AmatrixAT_matrixA?=?np.dot(np.transpose(matrixA),?matrixA)#然后求右奇異向量lambda_V,?X_V?=?np.linalg.eig(matrixAT_matrixA)lambda_V,?X_V?=?sortByEigenValue(lambda_V,?X_V)#求奇異值sigmas?=?lambda_Vsigmas?=?list(map(lambda?x:?np.sqrt(x)if?x?>?0?else?0,?sigmas))??#python里很小的數(shù)有時候是負(fù)數(shù)sigmas?=?np.array(sigmas)sigmasMatrix?=?np.diag(sigmas)if?NumOfLeft?==?None:rankOfSigmasMatrix?=?len(list(filter(lambda?x:?x?>?0,sigmas)))??#大于0的特征值的個數(shù)else:rankOfSigmasMatrix?=?NumOfLeftsigmasMatrix?=?sigmasMatrix[0:rankOfSigmasMatrix,?:]??#特征值為0的奇異值就不要了#計算右奇異向量X_U?=?np.zeros((matrixA.shape[0],?rankOfSigmasMatrix))??#初始化一個右奇異向量矩陣,這里直接進(jìn)行裁剪for?i?in?range(rankOfSigmasMatrix):X_U[:,?i]?=?np.transpose(np.dot(matrixA,?X_V[:,?i])?/?sigmas[i])#對右奇異向量和奇異值矩陣進(jìn)行裁剪X_V?=?X_V[:,?0:NumOfLeft]sigmasMatrix?=?sigmasMatrix[0:rankOfSigmasMatrix,?0:rankOfSigmasMatrix]#print(rebuildMatrix(X_U,?sigmasMatrix,?X_V))return?X_U,?sigmasMatrix,?X_V A?=?np.array([[1,?1,?1,?2,?2],?[0,?0,?0,?3,?3],?[0,?0,?0,?1,?1],?[1,?1,?1,?0,?0],[2,?2,?2,?0,?0],?[5,?5,?5,?0,?0],?[1,?1,?1,?0,?0]])A array([[1, 1, 1, 2, 2],[0, 0, 0, 3, 3],[0, 0, 0, 1, 1],[1, 1, 1, 0, 0],[2, 2, 2, 0, 0],[5, 5, 5, 0, 0],[1, 1, 1, 0, 0]]) X_U,?sigmasMatrix,?X_V?=?SVD(A,?NumOfLeft=3) X_U array([[ 1.96602638e-01, -5.12980706e-01, -6.20066911e-09],[ 3.08997616e-02, -8.04794293e-01, 1.69140901e-09],[ 1.02999205e-02, -2.68264764e-01, 5.63803005e-10],[ 1.76002797e-01, 2.35488225e-02, -7.63159275e-09],[ 3.52005594e-01, 4.70976451e-02, -1.52631855e-08],[ 8.80013984e-01, 1.17744113e-01, -3.81579637e-08],[ 1.76002797e-01, 2.35488225e-02, -7.63159275e-09]]) sigmasMatrix array([[9.81586105e+00, 0.00000000e+00, 0.00000000e+00],[0.00000000e+00, 5.25821946e+00, 0.00000000e+00],[0.00000000e+00, 0.00000000e+00, 1.16381789e-07]]) X_V array([[ 5.75872999e-01, 4.12749590e-02, 8.16496581e-01],[ 5.75872999e-01, 4.12749590e-02, -4.08248290e-01],[ 5.75872999e-01, 4.12749590e-02, -4.08248290e-01],[ 5.05512944e-02, -7.05297502e-01, 3.28082013e-17],[ 5.05512944e-02, -7.05297502e-01, 3.28082013e-17]]) #?rebuild?from?U,?sigma,?VrebuildMatrix(X_U,?sigmasMatrix,?X_V) array([[ 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,2.00000000e+00, 2.00000000e+00],[ 5.39915464e-17, 7.72260438e-16, -7.54662738e-16,3.00000000e+00, 3.00000000e+00],[ 9.57429619e-18, 2.48997260e-16, -2.59977132e-16,1.00000000e+00, 1.00000000e+00],[ 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,1.25546281e-17, 1.25546281e-17],[ 2.00000000e+00, 2.00000000e+00, 2.00000000e+00,2.51092563e-17, 2.51092563e-17],[ 5.00000000e+00, 5.00000000e+00, 5.00000000e+00,9.74347659e-18, 9.74347659e-18],[ 1.00000000e+00, 1.00000000e+00, 1.00000000e+00,1.38777878e-17, 1.38777878e-17]])
same as A.
from?PIL?import?Image import?requests from?io?import?BytesIOurl?=?'https://images.mulberry.com/i/mulberrygroup/RL5792_000N651_L/small-hampstead-deep-amber-small-classic-grain-ayers/small-hampstead-deep-amber-small-classic-grain-ayers?v=3&w=304' response?=?requests.get(url) img?=?Image.open(BytesIO(response.content)) img本章代碼來源:https://github.com/hktxt/Learn-Statistical-Learning-Method
下載地址
https://github.com/fengdu78/lihang-code
參考資料:
[1] 《統(tǒng)計學(xué)習(xí)方法》: https://baike.baidu.com/item/統(tǒng)計學(xué)習(xí)方法/10430179
[2] 黃海廣: https://github.com/fengdu78
[3] ?github: https://github.com/fengdu78/lihang-code
[4] ?wzyonggege: https://github.com/wzyonggege/statistical-learning-method
[5] ?WenDesi: https://github.com/WenDesi/lihang_book_algorithm
[6] ?火燙火燙的: https://blog.csdn.net/tudaodiaozhale
[7] ?hktxt: https://github.com/hktxt/Learn-Statistical-Learning-Method
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的复现经典:《统计学习方法》第15章 奇异值分解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 复现经典:《统计学习方法》第16章 主
- 下一篇: 复现经典:《统计学习方法》第22章 无监