流形學習(Manifold Learning)是機器學習中一大類算法的統稱,流形學習是非線性的降維方法(an approach to non-linear dimensionality reduction)。PCA、LDA等降維方法基於線性假設,經常會損失數據內部非線性的結構信息;流形學習是線性降維方法的generalization,目的是捕獲數據內部非線性的結構。而MDS就是流行學習中非常經典的一種方法。
多維尺度變換是一種在低維空間展示“距離”數據結構的多元數據分析技術,是一種將多維空間的研究對象簡化到低維空間進行定位、分析和歸類,同時又保留對象間原始關系的數據分析方法。多維尺度變換算法集中於保留高維空間中的“相似度”信息,而在一般的問題解決的過程中,這個“相似度”通常用歐式距離來定義。
通俗來講,就是將多維數據映射到低維空間,同時保持各個樣本之間的原有相對距離不變。
多維尺度變換的目標:當n 個對象中各對對象之間的相似性(或距離)給定時,確定這些對象在低維(歐式) 空間中的表示(稱為感知圖, Perceptual Mapping),
並使其盡可能與原先的相似性(或距離)“大體匹配”,使得由降維所引起的任何變形達到最小。
多維尺度變換可以應用到數據可視化,通過可視化找出異常點,反欺詐應用等。
計算步驟大致如下:
第一步:計算所有數據項兩兩間的實際距離(可參考皮爾遜算法或歐幾里德算法)
第二步:將數據項隨機放置在二維圖上。
第三步:針對每兩兩構成的一對數據項,將它們的實際距離與當前在二維圖上的距離進行比較,求出一個誤差值
第四步:根據誤差的情況,按照比例將每個數據項的所在位置移近或移遠少許量。(每一個節點的移動,都是所有其它節點施加在該節點上的推或拉的結合效應。)
第五步:重復第三步、第四步(節點每移動一次,其當前距離與實際距離的差距就會減少一些)。這一過程會不斷地重復多次,直到無法再通過移動節點來減少總體誤差為止。
python 實現
已知四個城市之間的距離,如何展示出他們的相對位置,原理就是利用MDS將多維數據映射到二維空間,作為經緯度坐標,同時之間的相對距離保持不變。
import numpy as np import pandas as pd from sklearn.manifold import MDS import matplotlib.pyplot as plt #%% data = np.array([(0,1046,608,1859), (1046,0,825,1149), (608,825,0,1280), (1859,1149,1280,0) ] ) index = ['beijing','shanghai','zhengzhou','guangzhou'] columns = ['beijing','shanghai','zhengzhou','guangzhou'] Word = pd.DataFrame(data,index,columns) Word #%% mds = MDS() mds.fit(data) #%% a = mds.embedding_ print(a) plt.scatter(a[0:,0],a[0:,1],color='red')