SVD 降維體現在什麼地方?

感覺即使把分解的三個矩陣變小,可乘回去整個矩陣並沒有小。


舉一個直觀的例子吧,這個例子大家隨手找張圖都可以復現。用SVD進行圖片壓縮。

我們知道,一張圖片的數據信息是由像素(pixels)點陣組成的,一張彩色的圖片即有三種顏色單元R,G,B的三個矩陣X_R,X_G,X_B所決定。簡單起見我們假設這三個矩陣都是方陣,維數n	imes n

我們可以對X_R,X_G,X_B做SGD分解,得到X_R=U_RSigma_R V_R^T, X_G=U_GSigma_G V_G^T, X_B=U_BSigma_R V_R^T

壓縮的意思是指我們不存儲全部的SVD信息,比如,對X_R來說,我們只存儲U_R的前k列(維數n	imes k),記作U_R^k,只存儲對角陣Sigma_R的前k個對角元組成的維數為k	imes k的對角陣,記作Sigma_R^k,只存儲V_R的前k列,記作V_R^k。如此,在重構X_R的時候,我們可以用一組比n低維的多的數據(k可以遠小於n)來reconstruct X_R^k=U_R^kSigma_R^k (V_R^k)^T,同理我們也可以有降到k維的X_G^k,X_B^k。注意了,根據題主的問題,X_R^k,X_G^k,X_B^k的維數確實仍是n 	imes n,然而用來重構的信息的維數卻實實在在降低了。從本質來講,如果假設原始的矩陣是滿秩的,重構之後矩陣的秩(rank)從n降到了k

好了,那麼這樣的壓縮實際效果如何呢?我隨手找了張愛因斯坦老爺爺的照片。

我們如果一點都不降維,用k=n的SVD重構這張圖片,會得到和原圖一模一樣的圖片,因為這個時候並沒有信息丟失。注意這張圖是400x400的,即n=400。我們這個時候用k=100,即丟掉75%的「信息」,我們會發現(下圖)重構出來的圖像仍然和原圖非常接近!這是因為SVD蘊含著主成分分析(PCA)的內核,丟掉的「信息」雖然多,但卻是300個不太重要的維度(不重要的「信息」),而保留下來的100個是更加重要的維度,所以總體來說信息的質量並沒有被大幅度的削弱,損失是遠小於75%的(更詳細的討論請見末尾我的另一個相關回答,這裡不展開)。至此,題主或許會有些明白所謂SVD降維的意味了。

那麼如果讓k=10呢?即只留下2.5%的維數...我們看到這時候重構出來的圖片就比較模糊了,一些細節信息被丟棄了,這個圖片的信息用秩等於10的矩陣是無法完全表達的。然而,我們仍然可以看出原圖的輪廓,即關鍵信息都被保留下來了

k=4的情況(1%重構):關鍵信息也開始丟失...

最後讓我們看一下k=2的情況,我們看到在這種情況下SVD重構出來的圖片只能是橫向和豎向條帶的組合...

相關回答:

機器學習中SVD和PCA一直沒有搞的特別清楚,應該如何理解呢? - 覃含章的回答 - 知乎


關鍵在於應用上,實際情況是前面不到10%的奇異值的和就佔了全部奇異值的和的99%以上,這樣只要計算這10%的矩陣大小便能滿足實際需求。它還有個好是對分解的矩陣無要求,算是矩陣理論中的鑽石王老五了。


三個矩陣有非常清楚的物理含義。第一個矩陣X中的每一行表示意思相關的一類詞,其中的每個非零元素表示這類詞中每個詞的重要性(或者說相關性),數值越大越相關。最後一個矩陣Y中的每一列表示同一主題一類文章,其中每個元素表示這類文章中每篇文章的相關性。中間的矩陣則表示類詞和文章雷之間的相關性。因此,我們只要對關聯矩陣A進行一次奇異值分解,w 我們就可以同時完成了近義詞分類和文章的分類。(同時得到每類文章和每類詞的相關性)。

------吳軍老師《數學之美》


大家都是從圖像降噪角度給你示範,我正好做過信號降噪,同理也拋個磚。

首先回答你的問題,

感覺即使把分解的三個矩陣變小,可乘回去整個矩陣並沒有小。

看起來確實是這樣,但降維並不是降得矩陣大小,若矩陣大小都變了,你還能分析么?

降的「維」,我理解上更像是信號。把原來紛繁複雜的信號進行拆解,剔除掉一些引入的雜訊,剩下原有信號中的出成分。

如果你理解傅里葉變換,可能以下的部分更好理解。時域信號可以通過傅里葉變換,在頻域上進行描述,這樣可以更好地理解信號(我覺得)。任何一個信號都可以用數個正弦函數進行描述,而對應的的正弦函數幅值便是該頻率信號在原信號中的比重。

這麼講好像有些枯燥,舉個例子吧~

先構造如下所示的脈衝模擬信號作為研究對象:

這組信號,在頻域上應該很好理解了吧,是由主成分是(頻率為3Hz,10Hz和20Hz的三個部分)和雜訊組成的三組信號。(如果你知道頻域時域概念的話)

另外,再在我們比較熟悉的時域上表示一下:

好了,我們已經有了三組互為對照的信號(理想信號、含雜訊信號),若對這三個信號應用矩陣低秩逼近(降噪)將有什麼效果呢?

一般而言,我們要進行低秩逼近,總不能胡亂逼近吧,即認為採集的信號中包含有幾階有用的信號。像這裡,如果我們認為信號中只有2階信號,那麼是不是漏了1個,她會不開心的。

在這裡採用奇異熵定階的方式,將信號與雜訊區分出來:

上面這個圖就是三個信號中奇異熵增量的圖了,可以看出在6階以後三個信號就基本趨於一個穩定值了。因此,可以發現無論信號中含不含雜訊,均可以確定信號中含有6階信號,剔除共軛項,實際的信號階次就是3階了,這是與我們設定的相同的。(有興趣的也可以發現,信噪比不同的信號在這個圖上差別還是挺大的,我就不說了)

通過這種方式,就可以大致確定你的信號的系統階次是多少。當然這是模擬,實際情況複雜多了,所以一波需要設置稍微大一點的階次,給信噪比較低的信號留個後門~

最後就是降噪了,先看看降噪的結果,圖省事就選個x2示意一下了。

可以發現,確定降階階次之後,就可以很好地消除信號雜訊了,毛刺都不見了。

信號的降噪與圖形降噪是類似的,但也不完全類似。之所以被叫作結構低秩逼近,就是需要把信號構造一個特定的矩陣形式,利用奇異熵、奇異值的概念進行降噪。

好了,先到這了。我猜具體怎麼操作應該也沒人關心,畢竟這是知乎...

科(zhuang)普(bi)結束,接著碼論文去。


SVD,即矩陣的奇異值分解,實質上是把矩陣分解為奇異值組成的矩陣和奇異值對應的特徵向量組成的矩陣的乘積的形式。

降維是使矩陣的秩變小,而不是使矩陣變小。

通過SVD降維的原理是,捨棄SVD結果中由奇異值組成的矩陣中數值很小的一部分奇異值,從而降低新得到矩陣的秩,同時保證得到的新矩陣和原矩陣的差異在一定範圍內。

下面從數學上描述如何通過SVD降維。

假設一個m×n的矩陣M的秩是r,則M存在如下形式的分解,即SVD:

M=USigma V^{T}

其中:

(1) U是一個m×r的矩陣,其每一列是矩陣MM^{T} 的正交特徵向量;

(2) V是一個r×n的矩陣,其每一行是矩陣M^{T} M的正交特徵向量;

(3) MM^{T} 的特徵值等於M^{T} M的特徵值,記為lambda _{1}, lambda _{2}, ... , lambda _{r}

(4) 對1 ≤ i ≤ r,使lambda_{i}geq lambda_{i+1},令sigma_{i} = sqrt{lambda_{i}} ,稱為矩陣M的奇異值,r×r的對角矩陣Σ滿足Sigma_{ii} = sigma_{i}

給定m×n的矩陣M和正整數k,k小於等於M的秩r,如果能找到一個秩不大於k的m×n的矩陣M_{k},使M和M_{k}的差異在可以接受的範圍內,就可以用M_{k}代替M,同時達到降維且丟失盡量少的信息的目的。

可以用兩個矩陣的差X = M - M_{k}的F-範數來度量兩個矩陣之間的差異程度:

||X||_{F} = sqrt{sum_{i=1}^{m} sum_{j=1}^{n}{x_{ij}^{2}}}

因此,目標是找到一個矩陣M_{k},使X的F-範數極小化,同時限制矩陣M_{k}的秩不大於k。

對矩陣M進行奇異值分解,得到M=USigma V^{T} ,把對角矩陣Σ對角線上最小的r-k個奇異值置為零,得到矩陣Sigma_{k},令矩陣M_{k}=USigma_{k} V^{T} ,可以證明:

min_{Z|rank(Z)leq k}||M-Z||_{F} = ||M-M_{k}||_{F}=sqrt{sum_{i=k+1}^{r}{sigma_{i}^{2}} }

因此,矩陣M_{k}是滿足F-範數最小的秩不大於k的矩陣,也被稱為矩陣M的k秩逼近矩陣。由於矩陣Sigma_{k}最多包含k個非零元素,所以矩陣M_{k}的秩不大於k。k越接近r,M_{k}和M的差異越小;當k=r時,M_{k}=M

以上,就是通過SVD降維的數學原理。SVD降維的應用很多,除了用於圖形壓縮和降噪,也在自然語言處理中用於隱形語義分析(LSA)。


我把來龍去脈講清楚:

看待一個矩陣,可以從多方面看。SVD則是從列向量如何生成的角度來看。

假設一個矩陣的列向量有100列,但只由少數幾個『』(比如10個吧)組合而成的,那麼如何求出這10個基?如果有了這些『基』,如何把這些基再組合起來生成這個矩陣?仔細想這句話,想明白就不用再看下面了。

為了幫助理解 ,給個簡單例子,比如以下矩陣(12行10列):

m=[

1,1,1,1,1,1,1,1,1,1;
1,1,0,0,0,0,0,0,1,1;
1,1,0,0,0,0,0,0,1,1;
1,1,0,0,1,1,0,0,1,1;
1,1,0,0,1,1,0,0,1,1;
1,1,0,0,1,1,0,0,1,1;
1,1,0,0,0,0,0,0,1,1;
1,1,0,0,0,0,0,0,1,1;
1,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1;
1,1,1,1,1,1,1,1,1,1;
]

很明顯,其實這裡面只有三個不同的列(12行3列):

U=[
1,1,1;
1,0,0;
1,0,0;
1,0,1;
1,0,1;
1,0,1;
1,0,0;
1,0,0;
1,1,1;
1,1,1;
1,1,1;
1,1,1;
]

那麼要從U生成M,只需要下面這個矩陣(3行10列):

V=[

1,1,0,0,0,0,0,0,1,1;
0,0,1,1,0,0,1,1,0,0;
0,0,0,0,1,1,0,0,0,0;

]

要還原M,只需要U*V。而M是120個元素,U是3列,36個元素,V是3行,30個元素。通過這個例子,我們看到了降維,10列變成3列。。。,還看到了壓縮。

現在,問題來了,既然這樣就能得到分解,我們何苦用SVD?答案很簡單:大多數矩陣不是靠人眼就能分辨出基,通常情況下,每一列都是不同的基組合而成。所以借用SVD演算法來找到基。

另外,每個基在生成列的時候,權重也不一樣。經常出現某幾個基權重特別大,而另外幾個基特別小。在SVD分解的時候,就可以得到這個值。如果看到這裡明白了,接下去可以不看。

接下來講SVD是怎麼達到我們的目標的:

再考慮下:什麼是良好的基?答案:一組良好的基應該是歸一化正交的,因為正交之後不會出現冗餘的信息。

所以,M應當分解成:一組正交的列基*權重(特徵值組成的對角矩陣)*一組正交的行向量。寫成公式就是

M_{m*n}=U_{m*m}*S_{m*n}*V_{n*n}^{

U就是列基,S就是權重,V則表示如何把U的列組合成M中的列。

U,S,V是怎麼求出來的?
這個是一個很巧妙的技巧了,想出來的傢伙是大神。

先講下預備知識 :

1.實係數矩陣與自己的轉置相乘後是實對稱矩陣,而且實對稱矩陣必定可以分解出特徵值與特徵向量。

2.如果矩陣是單位正交矩陣,那麼轉置是本身的逆矩陣。也就是A"*A=A*A"=I

接著看SVD,由於U是單位正交矩陣,S是對角矩陣,所以把M轉置再乘M,也就是

M

注意下, S^2 還是對角矩陣,所以求V,就是求M"*M的特徵值與特徵向量。

同理里,求U 就是求M*M"的特徵值與特徵向量。

嗯。。。特徵值與特徵向量的內容,我就不解釋了。自己看下書。

SVD使用

最後講下matlab中svd 函數的使用,以前面的矩陣為例,先SVD分解 ,得到U,S,V

&>&> [U,S,V]=svd(M)

U =

-0.3621 0.2531 -0.0696 0.8873 0.0684 0.0900 0.0000 -0.0000 -0.0000 0 0 0.0000

-0.1877 -0.3516 -0.3019 -0.0900 0.0349 0.8606 0.0000 -0.0000 -0.0000 0 0.0000 0.0000

-0.1877 -0.3516 -0.3019 0.0888 -0.8251 -0.2477 -0.0000 0.0000 0.0000 0 -0.0000 0.0000

-0.2604 -0.2486 0.4513 -0.0000 -0.0000 0.0000 0.7561 0.3082 -0.0000 0 0.0000 0.0000

-0.2604 -0.2486 0.4513 0.0000 -0.0000 -0.0000 -0.1111 -0.8089 0.0000 -0.0000 -0.0000 -0.0000

-0.2604 -0.2486 0.4513 0.0000 0.0000 -0.0000 -0.6450 0.5007 -0.0000 0.0000 0.0000 0.0000

-0.1877 -0.3516 -0.3019 0.0006 0.3951 -0.3065 0.0000 -0.0000 0.7071 -0.0000 -0.0000 -0.0000

-0.1877 -0.3516 -0.3019 0.0006 0.3951 -0.3065 -0.0000 0.0000 -0.7071 0.0000 0.0000 0.0000

-0.3621 0.2531 -0.0696 -0.2218 -0.0171 -0.0225 -0.0000 -0.0000 -0.0000 0.8660 -0.0000 -0.0000

-0.3621 0.2531 -0.0696 -0.2218 -0.0171 -0.0225 -0.0000 -0.0000 -0.0000 -0.2887 -0.5774 -0.5774

-0.3621 0.2531 -0.0696 -0.2218 -0.0171 -0.0225 -0.0000 -0.0000 -0.0000 -0.2887 0.7887 -0.2113

-0.3621 0.2531 -0.0696 -0.2218 -0.0171 -0.0225 -0.0000 -0.0000 -0.0000 -0.2887 -0.2113 0.7887

S =

8.4404 0 0 0 0 0 0 0 0 0

0 3.1763 0 0 0 0 0 0 0 0

0 0 1.6344 0 0 0 0 0 0 0

0 0 0 0.0000 0 0 0 0 0 0

0 0 0 0 0.0000 0 0 0 0 0

0 0 0 0 0 0.0000 0 0 0 0

0 0 0 0 0 0 0.0000 0 0 0

0 0 0 0 0 0 0 0.0000 0 0

0 0 0 0 0 0 0 0 0.0000 0

0 0 0 0 0 0 0 0 0 0.0000

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

V =

-0.3960 -0.2792 -0.1234 -0.8645 -0.0503 -0.0083 -0.0000 -0.0000 0 0

-0.3960 -0.2792 -0.1234 0.2961 -0.2482 0.7751 -0.0000 -0.0000 0.0000 -0.0000

-0.2145 0.3983 -0.2128 0.0503 -0.8176 -0.2810 0.0000 0.0000 0.0000 0.0000

-0.2145 0.3983 -0.2128 -0.0168 0.2725 0.0937 -0.4323 -0.6926 0.0000 0.0000

-0.3071 0.1636 0.6156 0.0000 -0.0000 0.0000 -0.5998 0.3744 -0.0000 0.0000

-0.3071 0.1636 0.6156 0.0000 -0.0000 0.0000 0.5998 -0.3744 0.0000 -0.0000

-0.2145 0.3983 -0.2128 -0.0168 0.2725 0.0937 0.2162 0.3463 0.7071 -0.0000

-0.2145 0.3983 -0.2128 -0.0168 0.2725 0.0937 0.2162 0.3463 -0.7071 0.0000

-0.3960 -0.2792 -0.1234 0.2842 0.1492 -0.3834 0.0000 0.0000 -0.0000 0.7071

-0.3960 -0.2792 -0.1234 0.2842 0.1492 -0.3834 0.0000 0.0000 -0.0000 -0.7071

&>&>

觀察下U,S,V。其中S中只有三個特徵值不為0,表明U中只有三個列向量是有效,那麼,要還原M,我們不需要U,S,V的全部。只需要各取三列就行:

U(:,1:3)*S(1:3,1:3)*V(:,1:3)"

ans =

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000

1.0000 1.0000 -0.0000 -0.0000 0.0000 0.0000 -0.0000 -0.0000 1.0000 1.0000

1.0000 1.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 -0.0000 1.0000 1.0000

1.0000 1.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 1.0000 1.0000

1.0000 1.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 1.0000 1.0000

1.0000 1.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 1.0000 1.0000

1.0000 1.0000 -0.0000 -0.0000 0.0000 0.0000 -0.0000 -0.0000 1.0000 1.0000

1.0000 1.0000 -0.0000 -0.0000 0.0000 0.0000 -0.0000 -0.0000 1.0000 1.0000

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000

1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000

&>&>

總結下:

要做一個降維的演算法 ,很簡單,只要SVD一下,計算下S的特徵值 ,哪些特徵值比較大,哪些比較小。大的保留,小的丟棄。然後就取相應數量的U列與V列。得到簡化的U1,S1,V1。就是降維了。


簡單說一下。或許降維這個提法是有點誤導人的。本質上SVD是一種近似演算法。在所有秩為k的矩陣中(k低於原矩陣的秩),總能找到找到最逼近(這個逼近的度量有富比尼範數等)原矩陣的一個。SVD所做的事情是,保留前k個奇異值及其對應的奇異矢量,算出的就是在秩為k的所有矩陣中達到上述逼近度量最小值的那個矩陣。


提取出主成分的方向再把數據往上投影叫降維,扔掉小的奇異值再乘回去叫降秩

你直接去看pca降維的推導,pca降維和svd降維在數學上完全等價,但pca降維的導出更直觀


當然會降維啊,只是一般不用,因為svd的代價相當於是兩次特徵值分解。看看這個你就懂

機器學習 - SVD - 行到水窮處,坐看雲起時 - CSDN博客


題主的問題,本是極好,我在試驗的時候遇到了,因此找到了這裡,發現許多回答都是扯,偏了,還是回答一下。

回答如henryWang評論里所說的一個重點

首先我們看一個最基本的MNist手寫字元識別的例子的做法,

一個圖像矩陣Flatten成一個28*28=784維的向量,然後我們用SVD獲得一個降維器,降維器應用於輸入的每一個圖像矩陣的展開向量x,獲得一個40維的向量,這個40維的向量就是最終的降維效果。

降維器的獲得就是訓練樣本組成的60000*784維的矩陣=&>[U, S, V],這裡可以指定40這個參數,或自己按S排序篩選等操作。

V就是我們的降維器矩陣,V.x==&>y

y就是40維的向量,這就是降維體現的效果,比如降維到40維向量後,做訓練獲得的精度是0.85左右。

類似的還是LSA,低秩分解,TSNE,等等等

-----------

PCA降維的例子在人臉識別里是入門級玩法之一,可以百度到一些帖子。

SVD圖片壓縮的例子則在二維視覺上有點讓人誤導,因為並沒有做特徵空間的壓縮,而是做了每一特徵的特徵值空間的壓縮,類似二值化。

但是二值化後Hash成一個比如64維的向量,這其實也是降維的一種。


乘回去變小了那還有用嗎,乘回去基本保持不變,或者去除了少量雜訊,才是想要的結果


推薦閱讀:

随机梯度下降是坐标下降的一种?
國內真正的大數據分析產品有哪些呢?只求乾貨爆料,不要廣告商!
最近开始学习机器学习,不知道看哪本书比较好(PRML ESL or MLAPP)?
如何評價Kaggle舉辦的Rental Listing Inquiries比賽?
CMU HCI 具體學些什麼?

TAG:數據挖掘 | 數學 | 機器學習 |