1. 程式人生 > >維度打擊,機器學習中的降維演算法:ISOMAP & MDS

維度打擊,機器學習中的降維演算法:ISOMAP & MDS

降維是機器學習中很有意思的一部分,很多時候它是無監督的,能夠更好地刻畫資料,對模型效果提升也有幫助,同時在資料視覺化中也有著舉足輕重的作用。

一說到降維,大家第一反應總是PCA,基本上每一本講機器學習的書都會提到PCA,而除此之外其實還有很多很有意思的降維演算法,其中就包括isomap,以及isomap中用到的MDS。

ISOMAP是‘流形學習’中的一個經典演算法,流形學習貢獻了很多降維演算法,其中一些與很多機器學習演算法也有結合,但上學的時候還看了蠻多的機器學習的書,從來沒聽說過流形學習的概念,還是在最新的周志華版的《機器學習》裡才看到,很有意思,記錄分享一下。

流形學習

流形學習應該算是個大課題了,它的基本思想就是在高維空間中發現低維結構。比如這個圖:此處輸入圖片的描述


這些點都處於一個三維空間裡,但我們人一看就知道它像一塊捲起來的布,圖中圈出來的兩個點更合理的距離是A中藍色實線標註的距離,而不是兩個點之間的歐式距離(A中藍色虛線)。

此時如果你要用PCA降維的話,它根本無法發現這樣捲曲的結構(因為PCA是典型的線性降維,而圖示的結構顯然是非線性的),最後的降維結果就會一團亂麻,沒法很好的反映點之間的關係。而流形學習在這樣的場景就會有很好的效果。

我對流形學習本身也不太熟悉,還是直接說演算法吧。

ISOMAP

在降維演算法中,一種方式是提供點的座標進行降維,如PCA;另一種方式是提供點之間的距離矩陣,ISOMAP中用到的MDS(Multidimensional Scaling)就是這樣。
在計算距離的時候,最簡單的方式自然是計算座標之間的歐氏距離,但ISOMAP對此進行了改進,就像上面圖示一樣:

1.通過kNN(k-Nearest Neighbor)找到點的k個最近鄰,將它們連線起來構造一張圖。
2.通過計算同中各點之間的最短路徑,作為點之間的距離dij放入距離矩陣D
3.D傳給經典的MDS演算法,得到降維後的結果。

ISOMAP本身的核心就在構造點之間的距離,初看時不由得為其拍案叫絕,類似的思想在很多降維演算法中都能看到,比如能將超高維資料進行降維視覺化的t-SNE。
ISOMAP效果,可以看到選取的最短路徑比較好地還原了期望的藍色實線,用這個資料進行降維會使流形得以保持:
此處輸入圖片的描述
ISOMAP演算法步驟可謂清晰明瞭,所以本文主要著重講它中間用到的MDS演算法,也是很有意思的。

經典MDS(Multidimensional Scaling)

如上文所述,MDS接收的輸入是一個距離矩陣D,我們把一些點畫在座標系裡:
此處輸入圖片的描述
如果只告訴一個人這些點之間的距離(假設是歐氏距離),他會丟失那些資訊呢?
a.我們對點做平移,點之間的距離是不變的。
b.我們對點做旋轉、翻轉,點之間的距離是不變的。

所以想要從D還原到原始資料X是不可能的,因為只給了距離資訊之後本身就丟掉了很多東西,不過不必擔心,即使這樣我們也可以對資料進行降維。

我們不妨假設:X是一個n×q的矩陣,n為樣本數,q是原始的維度
計算一個很重要的矩陣B

B=XXT(n×n)=(XM)(XM)T(M)=XMMTX=XXT
可以看到我們通過MX做正交變換並不會影響B的值,而正交變換剛好就是對資料做旋轉、翻轉操作的
所以如果我們想通過B反算出X,肯定是沒法得到真正的X,而是它的任意一種正交變換後的結果。

B中每個元素的值為:

bij=k=1qxikxjk
計算距離矩陣D,其中每個元素值為:
d2ij=(xixj)2=k=1q(xikxjk)2=k=1qx2ik+x2jk2xikxjk=bii+bjj2bij\tag{dij_square}\label{dij_square}
這時候我們有的只有D,如果能通過D計算出B,再由B計算出X,不就達到效果了嗎。

所以思路是:從D->B->X
此時我們要對X加一些限制,前面說過我們平移所有點是不會對距離矩陣造成影響的,所以我們就把資料的中心點平移到原點,對X做如下限制(去中心化):

i=1nxik=0,forallk=1..q
所以有
j=1nbij=j=1nk=1qxikxjk=k=1qxikj=1nxjk