流形學習t SNE,LLE,Isomap

2021-10-24 11:55:58 字數 3996 閱讀 6484

作者|andre ye 編譯|vk **|analytics indiamag

主成分分析是一種強大的方法,但它往往失敗,因為它假設資料可以線性建模。pca將新的特徵表示為現有特徵的線性組合,將每個特徵乘以乙個係數。

為了解決主成分分析的侷限性,人們通過對具有不同結構的資料進行應用而產生了各種各樣的技術。然而,流形學習尋求一種可以推廣到所有資料結構的方法。

為了把事情放在上下文中,考慮300×300畫素的頭像。在完美的條件下,每個影象都會完美地居中,但實際上,還需要考慮許多額外的自由度,例如燈光或臉部傾斜。如果我們把乙個頭像當作90000維空間中的乙個點,改變各種效果,比如傾斜頭部或朝不同的方向看,會使它在空間中非線性移動,即使它是同一類的同乙個物體。

這種資料經常出現在現實世界的資料集中。除此之外,當pca呈現傾斜分布、極值時,pca可能會變得很糟糕(參見非線性pca以獲得解決方案)。我們需要一種可推廣的降維方法。

流形學習就是指這個任務。流形學習中有許多方法可能是以前見過的,例如t-sne和區域性線性嵌入(lle)。有許多文章和**深入到這些演算法的技術和數學細節,但這篇文章將集中在一般的直覺和實現上。

注意,雖然有一些維度縮減的變體是有監督的(例如線性/二次判別分析),流形學習通常指的是無監督的降維,其中類別沒有提供給演算法(雖然可能存在)。

pca試圖建立幾個線性超平面來表示維度,就像多元回歸構造作為資料的估計,流形學習嘗試學習流形,流形是多維空間中光滑的曲面。如下圖所示,這些通常是通過對影象進行細微的變換而形成的。

然後,local linear patches可以提取與流形相切的部分。這些patches(補丁)通常有足夠的數量,因此可以準確地表示流形。

這些流形不是由任何乙個數學函式建模的,而是由幾個小的線性補丁,所以這些線性鄰域可以建模任何流形。雖然這可能不是明確的某些演算法如何接近建模的流形,基本思想是非常相似的。

以下是流形學習演算法的基本假設或方面:

通過研究分解這個螺旋狀資料集之間的不同方法,可以很好地理解這個想法。左側是一種更像pca的方法,用於儲存資料的形狀,其中每個點彼此連線。然而,右邊是一種只計算資料點鄰域之間的距離的方法。

這種對鄰域之外的點的相對忽視會導致有趣的結果。例如,考慮這個瑞士軋輥資料集,它被捲繞在三維空間中,並被簡化為二維的條形圖。在某些情況下,這種效果並不理想。然而,如果這條曲線是影象中攝像機傾斜或音訊質量受到外部影響的結果,流形學習通過巧妙地解開這些複雜的非線性關係給我們帶來了巨大的幫助。

在瑞士roll資料集上,pca甚至像kernel-pca這樣的特殊變體都無法捕捉值的梯度。另一方面,流形學習演算法區域性線性嵌入(lle)也能夠做到。

讓我們更詳細地了解三種流行的流形學習演算法:isomap、區域性線性嵌入和t-sne。

流形學習的最早探索之一是isomap演算法,即等距對映的縮寫。isomap尋求一種低維表示,以保持點之間的「距離」。距離是曲面距離的推廣。因此,isomap不是用畢達哥拉斯定理匯出的距離公式來測量純歐幾里德距離,而是沿著發現的流形優化距離。

當在mnist資料集上訓練時,isomap的效能優於pca,顯示了不同型別的數字的正確分割。某些數字組之間的接近和距離揭示了資料的結構。例如,距離較近的「5」和「3」(在左下角)看起來確實很相似。

下面是isomap在python中的實現。由於mnist是乙個非常大的資料集,所以你可能只想在前100個訓練示例中使用.fit_transform(x[:100])訓練isomap。

from sklearn.datasets import load_digits #mnist

from sklearn.manifold import isomap

x, _ = load_digits(return_x_y=true) #載入資料

embedding = isomap(n_components=2) #結果資料有2個維度,即「成分」

x_transformed = embedding.fit_transform(x) #擬合模型及變換

區域性線性嵌入使用各種切線線性麵片(如上圖所示)來建模流形。它可以被認為是對每個鄰域進行區域性pca,生成乙個線性超平面,然後全域性比較結果以找到最佳的非線性嵌入。lle的目標是以扭曲的方式「展開」或「解包」資料的結構,因此lle通常會在中心具有更高密度。

注意,lle在mnist資料集上的效能相對較差。這很可能是因為mnist資料集由多個流形組成,而lle被設計用於處理更簡單的資料集(如swiss roll)。它將乙個函式表示為幾個小的線性函式的策略可能無法很好地處理大型複雜的資料集結構。

假設資料集(x)已經載入,lle的實現如下所示。

from sklearn.manifold import locallylinearembedding

embedding = locallylinearembedding(n_components=2) #2維

x_transformed = embedding.fit_transform(x)

t-sne是高維視覺化中最流行的選擇之一,是t分布隨機鄰居嵌入的代表。該演算法將原始空間中的關係轉化為t分布,即小樣本和相對未知標準差的正態分佈。這使得t-sne對流形學習中常見的區域性結構非常敏感。由於它具有許多優點,因此被認為是一種可行的視覺化方法。優點如下:

isomap和lle是展開單個、連續、低維流形的最佳工具。另一方面,t-sne關注資料的區域性結構,試圖聚集區域性,而不是試圖「展開」。這使得t-sne在用多個流形去擬合高維資料方面佔據了上風。它使用梯度下降法訓練,並試圖最小化分布之間的熵。從這個意義上講,它幾乎就像乙個簡化的、無監督的神經網路。

t-sne非常強大,isomap和lle嘗試展開資料,而t-sne嘗試聚集資料。對於像mnist這樣的高維多流形資料集,旋轉和移位導致非線性關係,t-sne的效能甚至比lda更好,lda還需要標籤資訊。

然而,t-sne也有一些缺點:

t-sne也可在sklearn中實現:

from sklearn.manifold import tsne

embedding = tsne(n_components=2) ##2維

x_transformed = embedding.fit_transform(x)

t-sne的作者laurens van der maaten說,當t-sne結果不好時,應考慮以下幾點:

作為健全性檢查,嘗試對資料執行pca以將其減少到二維。如果這也給出了糟糕的結果,那麼也許你的資料在一開始就沒有很好的結構。如果pca很好,但t-sne不行,我很肯定你做錯了什麼。

他為什麼這麼說?流形學習不是pca的另一種變體,而是一種泛化。在pca中表現良好的東西幾乎可以保證在t-sne或其他流形學習技術中表現良好,因為它們是泛化。

就像乙個蘋果也是乙個水果(泛化)的物件一樣,如果某個事物不能產生與它的泛化相似的結果,那麼通常就是錯誤的。另一方面,如果這兩種方法都失敗了,資料很可能很難建模。

關鍵點

sklearn機器學習中文官方文件:

流形學習(一)

1 什麼是流形?經常會在 裡看到 嵌入在高維空間中的低維流形 高維的資料對於我們總是難以想像,所以最直觀的例子通常都會是嵌入在三維空間中的二維或者一維流形。比如說一塊布,可以把它看成乙個二維平面,這是乙個二維的歐氏空間,現在我們 在三維 中把它扭一扭,它就變成了乙個流形 當然,不扭的時候,它也是乙個...

幾種流形學習演算法

區域性線性嵌入 lle 前提假設 取樣資料所在的低維流形在區域性是線性的,即每個取樣點可以用它的近鄰點線性表示。求解方法 特徵值分解。lle演算法 計算每乙個點xi的近鄰點,一般採用k近鄰或者 領域。計算權值wij,使得把xi用它的k個近鄰點線性表示的誤差最小,即通過最小化 xi wijxj 來求出...

十 Sklearn流形學習

參考url 流形學習是一種無監督評估器,它試圖將乙個低維度流形嵌入到乙個高維度空間來描述資料集。通過觀察這個資料集,可以看到資料集中選中的x值和y值並不是對資料的最基本描述 即使放大 縮小或旋轉資料,hello 仍然會很明顯。這說明x和y的值並不是資料間關係的必要基礎特徵。這個例子中真正的基礎特徵是...