本想把pca和svd寫在一起,可上篇pca還沒寫清楚就已經4頁word了。再把svd和特徵工程的內容加上,實在是太長了,一下說太多也記不住,於是重開一篇。
svd用到的原理和 pca非常相似,就不再此贅述了,如果對特徵值、特徵向量相關問題不清楚請參見前篇《機器學習_用pca主成分分析給資料降維》
先回憶一下特徵值分解:把向量x往特徵向量方向上分解,然後每個方向上做伸縮,最後再把結果加起來即可。也可以理解為將向量x轉到正交座標系,在各個座標軸的方向上縮放後,再轉換回原來的座標系。只有方陣才能做特徵值分解,因此我們在pca中不是直接對資料做分解,而是對引數的協方差矩陣做分解。
我們知道,任何矩陣都可以分解為三個矩陣的乘積 a=u * sigma * vt,也就是奇異值分解.其中 u 和vt 均是酉陣(正交陣在複數域的推廣),而 sigma 為增廣對角陣。從直觀上講,u 和 vt 可視為旋轉操作,sigma 可視為縮放操作。因此奇異值分解的含義就是說,若將矩陣看做乙個變換,那麼任何這樣的變換可以看做是兩個旋轉和乙個縮放變換的復合,這點和特徵值分解基本一樣。它也可以通過對sigma的調整實現降維,通過u和vt在高維和低維間轉換。相比特徵值分解,奇異值分解可處理的不只是協方差矩陣(方陣),還可以直接處理資料。
但svd也有一些問題,比如資料多的時候,奇異值分解的計算量會很大,不像pca做特徵值分解時,矩陣的大小只和屬性個數相關。
(1) 功能
對矩陣a做svd分解;降維;原始資料轉到低維度;降維後的資料恢復到原來維度,看資料損失。
(2) **
from numpy import linalg
import array
import numpy as np
a=np.mat([[1,2,3],[4,5,6]])
u,sigma,vt=linalg.svd(a)
print("u",u)
print("sigma",sigma)
print("vt",vt)
sigma[1]=0 # 降維
print("sigma",sigma)
s = np.zeros((2,3))
s[:2, :2] = np.diag(sigma)
print("a conv:", np.dot(np.dot(a.t, u), s)) # 原始資料轉到低維
print("a':", np.dot(np.dot(u, s), vt)) # 恢復原始維度
(3) 執行結果('u', matrix([[-0.3863177 , -0.92236578],
[-0.92236578, 0.3863177 ]]))
('sigma', array([ 9.508032 , 0.77286964]))
('vt', matrix([[-0.42866713, -0.56630692, -0.7039467 ],
[ 0.80596391, 0.11238241, -0.58119908],
[ 0.40824829, -0.81649658, 0.40824829]]))
('sigma', array([ 9.508032, 0. ]))
('a conv:', matrix([[-38.7526545 , 0. , 0. ],
[-51.19565893, 0. , 0. ],
[-63.63866337, 0. , 0. ]]))
("a':", matrix([[ 1.57454629, 2.08011388, 2.58568148],
[ 3.75936076, 4.96644562, 6.17353048]]))
(4) 分析
svd分解矩陣a,a是乙個2x3(mn,其中m是行數)的矩陣,把它分解成三個矩陣的乘積:a=u * sigma * vt,其中u的大小是2x2(mm),vt為33(nn),sigma為min(m,n),從矩陣乘法的角度上看,sigma的大小應該是m*n,由於它是對角陣,為了簡化,這裡只取了對角線上元素。
sigma奇異值為(9.508032,0.77286964),兩值差異很大,說明轉換後特徵主要集中在乙個維度上,於是降維,sigma調整 為(9.508032,0)。將原始矩陣a轉置後乘u和調整後的sigma,實現了對a的降維。最後,將調整後的sigma與u,vt相乘,對映回原始維度,變為矩陣a』,對比之下,a』與a的也差不太多。不過把兩維降成一維還是挺誇張的,在此只為舉例,大家領會精神吧。
這裡比較重的是:觀察sigma,決定保留前幾項?svd()函式對求出的奇異值和奇異向量按大小做了排序,其中值明顯大的前n項,說明有n個「綜合引數」最重要,因此,可以將資料降成n維。可降維度的多少,主要還是看資料的相關性,相關性越大,越適合降維。
(1) 壓縮
把的畫素放乙個矩陣裡,做svd分解,只保留sigma中值大的前n項。則儲存時只需儲存三個矩陣,假設原圖大小100x100,n為5,則原圖要10000點儲存,而拆分後100x5+100x5+5=1005,影象大小變為原來的1/10。
(2) 資料降維
矩陣中記20人試吃這5種**的評價(5x20),先對整體資料做svd分解,假設保留sigma的前3項,把原矩陣轉置並和u,sigma相乘,矩陣就從520維變成了35維。再套用各種學習演算法時,資料就大大縮減了(從高維到低維投影)。不過20個維度變為3個維度後,屬性意義也不像之前那麼直觀了,我們可以使用vt矩陣把資料恢復到原來的維度。
SVD奇異值分解 機器學習
簡介 奇異值分解 singular value decomposition 是線性代數中一種重要的矩陣分解,是在機器學習領域廣泛應用的演算法,它不光可以用於降維演算法中的特徵分解,還可以用於推薦系統,以及自然語言處理等領域。是很多機器學習演算法的基石。奇異值分解在資料降維中有較多的應用,這裡把它的原...
奇異值分解 SVD
最近不小心接觸到了svd,然後認真看下去之後發現這東西真的挺強大的,把乙個推薦問題轉化為純數學矩陣問題,看了一些部落格,把乙個寫個比較具體的博文引入進來,給自己看的,所以把覺得沒必要的就去掉了,博文下面附原始部落格位址。一 基礎知識 1.矩陣的秩 矩陣的秩是矩陣中線性無關的行或列的個數 2.對角矩陣...
SVD奇異值分解
原文出處 今天我們來講講奇異值分解和它的一些有意思的應用。奇異值分解是乙個非常,非常,非常大的話題,它的英文是 singular value decomposition,一般簡稱為 svd。下面先給出它大概的意思 對於任意乙個 m n 的矩陣 m 不妨假設 m n 它可以被分解為 m udv t 其...