等度量映射(Isometric Feature Mapping,Isomap)是流形學習的一種,用於非線性數據降維,是一種無監督算法。
Isomap所採用的核心算法和MDS是一致的,區別在於原始空間中的距離矩陣的計算上。很多數據是非線性結構,不適合直接採用PCA算法和MDS算法。在非線性數據結構中,流形上距離很遠(測地距離,即在曲面上(不允許離開曲面)從A點走到B點的最短距離)的兩個數據點,在高維空間中的距離(歐式距離)可能非常近。
Isomap最主要的優點就是使用「測地距離」,而不是使用原始的歐幾裡得距離,這樣可以更好得控制數據信息的流失,能夠在低維空間中更加全面地將高維空間的數據表現出來,如下圖經典的「瑞士卷」模型,通過從點1到點9的k近鄰層層遞進方法,得到紅色曲線,即為兩點之間的測地距離。
(1)首先建立鄰近圖:對於每個樣本點,計算它的k近鄰,利用流形在局部上的歐式空間同胚性質,基於歐式距離,找出每個點在低維流形上的近鄰點,建立近鄰連接圖;(2)計算兩個點之間的測地距離:調用最短路徑算法計算任意兩樣本點之間的距離,計算近鄰圖上任意兩點之間的最短路徑,作為兩點之間的距離;(3)低維映射:得到兩點之間的測地距離後,通過MDS算法獲得樣本點在地位空間中的坐標。(1)k近鄰圖:指定近鄰點個數,例如指定距離最近的k個點為近鄰點;(2)ε近鄰圖:指定近鄰點閾值ε,距離小於ε的點被認為是近鄰點。在建立近鄰圖時,應當注意控制近鄰圖的範圍,否則容易出現「短路」或者「斷路」問題:
(1)「短路」問題:近鄰範圍制定過大,距離很遠的點也被誤認為是近鄰;
(2)「斷路」問題:近鄰範圍制定過小,本應當相鄰的點被認為斷開的。
Isomap算法針對MDS算法,解決了MDS基於歐式距離映射非線性結構高維數據的局限性。然而,對於新樣本,難以將其映射到低維空間。理論上可以將新樣本添加到數據集中,重新調用Isomap算法,但這方案計算量太大。一般的解決方法是,訓練一個回歸學習器對新樣本的低維空間進行預測。
以鳶尾花數據集為例,實現Isomap降維算法。原始數據集包含三種不同的分類,共150條數據,每個數據有四個特徵。#(1)導入必要程序庫import numpy as npimport matplotlib.pyplot as pltfrom sklearn import datasets,decomposition,manifold
#(2)加載數據def load_data(): iris=datasets.load_iris() return iris.data,iris.target
#(3)使用Isomapdef test_Isomap(*data): X,y=data for n in [4,3,2,1]: isomap=manifold.Isomap(n_components=n) isomap.fit(X) print('reconstruction_error(n_components=%d):%s'%(n, isomap.reconstruction_error()))X,y=load_data()test_Isomap(X,y)
#(4)降維後的樣本分布圖def plot_Isomap(*data): X,y=data Ks=[1,5,25,y.size-1] fig=plt.figure() for i,k in enumerate(Ks): isomap=manifold.Isomap(n_components=2,n_neighbors=k) X_r=isomap.fit_transform(X) ax=fig.add_subplot(2,2,i+1) colors=((1,0,0),(0,1,0),(0,0,1),(0.5,0.5,0),(0,0.5,0.5),(0.5,0,0.5), (0.4,0.6,0),(0.6,0.4,0),(0,0.6,0.4),(0.5,0.3,0.2),) for label,color in zip(np.unique(y),colors): position=y==label ax.scatter(X_r[position,0],X_r[position,1],label='target=%d'%label,color=color) ax.set_xlabel('X[0]') ax.set_ylabel('X[1]') ax.legend(loc='best') ax.set_title("k=%d"%k) plt.suptitle('Isomap') plt.tight_layout(pad=2) plt.show()plot_Isomap(X,y)
#(5)將原始數據壓縮到一維def plot_Isomap_k_d1(*data): X,y=data Ks=[1,5,25,y.size-1] fig=plt.figure() for i,k in enumerate(Ks): isomap=manifold.Isomap(n_components=2,n_neighbors=k) X_r=isomap.fit_transform(X) ax=fig.add_subplot(2,2,i+1) colors=((1,0,0),(0,1,0),(0,0,1),(0.5,0.5,0),(0,0.5,0.5),(0.5,0,0.5), (0.4,0.6,0),(0.6,0.4,0),(0,0.6,0.4),(0.5,0.3,0.2),) for label,color in zip(np.unique(y),colors): position=y==label ax.scatter(X_r[position],np.zeros_like(X_r[position]),label='target=%d'%label,color=color) ax.set_xlabel('X[0]') ax.set_ylabel('Y') ax.legend(loc='best') ax.set_title("k=%d"%k) plt.suptitle('Isomap') plt.tight_layout(pad=2) plt.show()plot_Isomap_k_d1(X,y)代碼運行如下:
reconstruction_error(n_components=4):1.0094929893039135
reconstruction_error(n_components=3):1.0181252006659833
reconstruction_error(n_components=2):1.0275229261937564reconstruction_error(n_components=1):1.0715321251523136
降維後的樣本分布如下:
將原始數據的特徵直接壓縮到一維效果如下:
sklearn與機器學習系列專題之降維(六)一文弄懂LLE特徵篩選&降維
歡迎關注公眾號「碼點聯盟」,不定期分享機器學習、深度學習乾貨,及各種資料大禮包!另外,這是一個由一線網際網路大廠算法工程師及雙985研究生創建的公眾號,後續會經常分享各類實用機器學習算法技術文章,歡迎交流討論!我們也長期承接各類機器學習、圖像處理、Halcon等算法項目,有「願意接私貨的技術員」 或 「有算法需求的個人或者公司項目」 可以通過公眾號聯繫我們!