最近在看論文的時候看到論文中使用isomap算法把3D的人臉project到一個2D的image上。提到降維,我的第一反應就是PCA,然而PCA是典型的線性降維,無法較好的對非線性結構降維。ISOMAP是‘流形學習’中的一個經典算法,流形學習貢獻了很多降維算法,其中一些與很多機器學習算法也有結合,先粗糙的介紹一下’流形學習‘。
流形學習
流形學習應該算是個大課題了,它的基本思想就是在高維空間中發現低維結構。比如這個圖:

這些點都處於一個三維空間里,但我們人一看就知道它像一塊卷起來的布,圖中圈出來的兩個點更合理的距離是A中藍色實線標注的距離,而不是兩個點之間的歐式距離(A中藍色虛線)。
此時如果你要用PCA降維的話,它根本無法發現這樣卷曲的結構(因為PCA是典型的線性降維,而圖示的結構顯然是非線性的),最后的降維結果就會一團亂麻,沒法很好的反映點之間的關系。而流形學習在這樣的場景就會有很好的效果。
經典MDS(Multidimensional Scaling)
如上文所述,MDS接收的輸入是一個距離矩陣DD,我們把一些點畫在坐標系里:

如果只告訴一個人這些點之間的距離(假設是歐氏距離),他會丟失那些信息呢?
a.我們對點做平移,點之間的距離是不變的。
b.我們對點做旋轉、翻轉,點之間的距離是不變的。
所以想要從D還原到原始數據X是不可能的,因為只給了距離信息之后本身就丟掉了很多東西,不過不必擔心,即使這樣我們也可以對數據進行降維(why?點這里)。
ISOMAP(等距特征映射)
其實線性流形方法無法在非線性流形上解決的問題,無非是需要解決兩個問題:
1、如何測量流形上的幾何距離?
2、如何將高維的2016維歐式空間映射到三維的低維空間?
首先,針對問題1,將MDS算法中的歐式距離換成“測地距離”,先拋一個“測地線的維基定義”。預熱以后,我們來看經典的瑞士卷(圖A),注意以下圖A、B、C均來源於原文論文Fig3截圖:

現在要我們把自己想象成是瑞士卷上的螞蟻(對人類來說瑞士卷是三維的,對螞蟻來說是二維的),上圖A中的兩個黑色圈圈為兩只恩愛無比的螞蟻,如何讓這兩只螞蟻在最短的時間內見面呢?要走最短路徑測地線藍色線才是正道(直線最短?直接沿着虛線強行闊過去?你不想活了么?)因此,拋棄歐式距離,引來測地距離~
鄰近點:直接計算鄰近點之間的歐式空間距離
遠距離的點:計算鄰近點之間的最短距離連接成的序列,如下圖所示(來源於博客),要計算空間中遠距離的亮點1與9,計算1到9的最短路徑1、2、3...9,沿着路徑依次類推直到到達目的地9(根據流形中的全局非線性和局部線性屬性):

最后形成如下圖所示的瑞士卷上的逼近測地線,如下圖B中的紅色線條所示:

實現方法:引入圖論框架,將數據作為圖中的點,點與其鄰近點之間使用邊來連接,逼近的測地線使用最短路徑代替。
Isomap算法流程如下:
步驟1:構建鄰接圖G(復雜度:O(DN2))
基於輸入空間X中流形G上的的鄰近點對i,j之間的歐式距離dx (i,j),選取每個樣本點距離最近的K個點(K-Isomap)或在樣本點選定半徑為常數ε的圓內所有點為該樣本點的近鄰點,將這些鄰近點用邊連接,將流形G構建為一個反映鄰近關系的帶權流通圖G;
步驟2:計算所有點對之間的最短路徑(復雜度:O(DN2))
通過計算鄰接圖G上任意兩點之間的最短路徑逼近流形上的測地距離矩陣DG={dG(i,j)},最短路徑的實現以Floyd或者Dijkstra算法為主。
步驟3:構建k維坐標向量(復雜度:O(dN2))
根據圖距離矩陣DG={dG(i,j)}使用經典Mds算法在d維空間Y中構造數據的嵌入坐標表示(如下圖C所示),選擇低維空間Y的任意兩個嵌入坐標向量yi與yj使得代價函數最小:

其中等式1.1的全局最優解可以通過將坐標向量yi設置為距離矩陣DG前d個特征值對應的特征向量來得到。

(還是偷懶了,沒有去看看具體的例子,要用的時候再說把23333)
Reference:
[1] https://blog.csdn.net/dark_scope/article/details/53229427
[2] https://www.cnblogs.com/wing1995/p/5479036.html
