Isomap在Python中怎么實現(xiàn)

這篇文章主要講解了“Isomap在Python中怎么實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Isomap在Python中怎么實現(xiàn)”吧!

創(chuàng)新互聯(lián)建站長期為上千多家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為鋼城企業(yè)提供專業(yè)的成都網(wǎng)站建設、網(wǎng)站制作,鋼城網(wǎng)站改版等技術服務。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

主成分分析是一種強大的方法,但它往往失敗,因為它假設數(shù)據(jù)可以線性建模。PCA將新的特征表示為現(xiàn)有特征的線性組合,將每個特征乘以一個系數(shù)。

Isomap在Python中怎么實現(xiàn)

為了解決主成分分析的局限性,人們通過對具有不同結(jié)構(gòu)的數(shù)據(jù)進行應用而產(chǎn)生了各種各樣的技術。然而,流形學習尋求一種可以推廣到所有數(shù)據(jù)結(jié)構(gòu)的方法。

不同的數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)中不同的屬性。例如,它可能是線性可分的,也可能是非常稀疏的。數(shù)據(jù)中的關系可以是相切的、平行的、包絡的或正交的。PCA在非常特定的數(shù)據(jù)結(jié)構(gòu)子集上工作得很好,因為它是在線性假設下工作的。

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

Isomap在Python中怎么實現(xiàn)

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

流形學習就是指這個任務。流形學習中有許多方法可能是以前見過的,例如t-SNE和局部線性嵌入(LLE)。有許多文章和論文深入到這些算法的技術和數(shù)學細節(jié),但這篇文章將集中在一般的直覺和實現(xiàn)上。

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

PCA試圖創(chuàng)建幾個線性超平面來表示維度,就像多元回歸構(gòu)造作為數(shù)據(jù)的估計,流形學習嘗試學習流形,流形是多維空間中光滑的曲面。如下圖所示,這些通常是通過對圖像進行細微的變換而形成的。

Isomap在Python中怎么實現(xiàn)

然后,local linear patches可以提取與流形相切的部分。這些patches(補?。┩ǔS凶銐虻臄?shù)量,因此可以準確地表示流形。

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

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

  • 數(shù)據(jù)中存在著可以通過流形建模的非線性關系—曲面跨越多個維度,平滑,且不太“搖擺”(太復雜)。

  • 保持數(shù)據(jù)的多維形狀并不重要。與其用特定的方向來“展開”或“投影”數(shù)據(jù)(如PCA)來保持數(shù)據(jù)的一般形狀,不如執(zhí)行更復雜的操作,如展開一個卷曲的條帶或?qū)⑶蝮w從內(nèi)向外翻轉(zhuǎn)。

  • 流形建模的最佳方法是將曲面視為由幾個鄰域組成的曲面。如果每個數(shù)據(jù)點都設法保持與所有其他點之間的距離,而只保留與它相鄰的點之間的距離,則可以在數(shù)據(jù)中保持幾何關系。

通過研究分解這個螺旋狀數(shù)據(jù)集之間的不同方法,可以很好地理解這個想法。左側(cè)是一種更像PCA的方法,用于保存數(shù)據(jù)的形狀,其中每個點彼此連接。然而,右邊是一種只計算數(shù)據(jù)點鄰域之間的距離的方法。

Isomap在Python中怎么實現(xiàn)

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

Isomap在Python中怎么實現(xiàn)

在瑞士Roll數(shù)據(jù)集上,PCA甚至像Kernel-PCA這樣的特殊變體都無法捕捉值的梯度。另一方面,流形學習算法局部線性嵌入(LLE)也能夠做到。

Isomap在Python中怎么實現(xiàn)

讓我們更詳細地了解三種流行的流形學習算法:IsoMap、局部線性嵌入和t-SNE。

流形學習的最早探索之一是Isomap算法,即等距映射的縮寫。Isomap尋求一種低維表示,以保持點之間的“距離”。距離是曲面距離的推廣。因此,Isomap不是用畢達哥拉斯定理導出的距離公式來測量純歐幾里德距離,而是沿著發(fā)現(xiàn)的流形優(yōu)化距離。

Isomap在Python中怎么實現(xiàn)

當在MNIST數(shù)據(jù)集上訓練時,Isomap的性能優(yōu)于PCA,顯示了不同類型的數(shù)字的正確分割。某些數(shù)字組之間的接近和距離揭示了數(shù)據(jù)的結(jié)構(gòu)。例如,距離較近的“5”和“3”(在左下角)看起來確實很相似。

下面是Isomap在Python中的實現(xiàn)。由于MNIST是一個非常大的數(shù)據(jù)集,所以你可能只想在前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) #加載數(shù)據(jù)

embedding = Isomap(n_components=2) #結(jié)果數(shù)據(jù)有2個維度,即“成分”
X_transformed = embedding.fit_transform(X) #擬合模型及變換

局部線性嵌入使用各種切線線性面片(如上圖所示)來建模流形。它可以被認為是對每個鄰域進行局部PCA,生成一個線性超平面,然后全局比較結(jié)果以找到最佳的非線性嵌入。LLE的目標是以扭曲的方式“展開”或“解包”數(shù)據(jù)的結(jié)構(gòu),因此LLE通常會在中心具有更高密度。

Isomap在Python中怎么實現(xiàn)

注意,LLE在MNIST數(shù)據(jù)集上的性能相對較差。這很可能是因為MNIST數(shù)據(jù)集由多個流形組成,而LLE被設計用于處理更簡單的數(shù)據(jù)集(如Swiss Roll)。它將一個函數(shù)表示為幾個小的線性函數(shù)的策略可能無法很好地處理大型復雜的數(shù)據(jù)集結(jié)構(gòu)。

假設數(shù)據(jù)集(X)已經(jīng)加載,LLE的實現(xiàn)如下所示。

from sklearn.manifold import LocallyLinearEmbedding
embedding = LocallyLinearEmbedding(n_components=2) #2維
X_transformed = embedding.fit_transform(X)

t-SNE是高維可視化中最流行的選擇之一,是t分布隨機鄰居嵌入的代表。該算法將原始空間中的關系轉(zhuǎn)化為t分布,即小樣本和相對未知標準差的正態(tài)分布。這使得t-SNE對流形學習中常見的局部結(jié)構(gòu)非常敏感。由于它具有許多優(yōu)點,因此被認為是一種可行的可視化方法。優(yōu)點如下:

  • 它能夠在多個尺度上揭示數(shù)據(jù)的結(jié)構(gòu)。

  • 它揭示了存在于多個流形和簇中的數(shù)據(jù)

  • 在中心聚集點的趨勢較小。

Isomap和LLE是展開單個、連續(xù)、低維流形的最佳工具。另一方面,t-SNE關注數(shù)據(jù)的局部結(jié)構(gòu),試圖聚集局部,而不是試圖“展開”。這使得t-SNE在用多個流形去擬合高維數(shù)據(jù)方面占據(jù)了上風。它使用梯度下降法訓練,并試圖最小化分布之間的熵。從這個意義上講,它幾乎就像一個簡化的、無監(jiān)督的神經(jīng)網(wǎng)絡。

t-SNE非常強大,Isomap和LLE嘗試展開數(shù)據(jù),而t-SNE嘗試聚集數(shù)據(jù)。對于像MNIST這樣的高維多流形數(shù)據(jù)集,旋轉(zhuǎn)和移位導致非線性關系,t-SNE的性能甚至比LDA更好,LDA還需要標簽信息。

Isomap在Python中怎么實現(xiàn)

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

  • t-SNE在計算上非常昂貴(比較上面圖表中的運行時)。對于一百萬個樣本數(shù)據(jù)集,它可能需要幾個小時,而PCA可以在幾秒鐘或幾分鐘內(nèi)完成。

  • 該算法利用隨機性(隨機性)選取種子,如果種子放置不當,會增加算法的運行時間,降低性能。

  • 全局結(jié)構(gòu)沒有被顯式地保留(即更強調(diào)聚類而不是展示全局結(jié)構(gòu))。然而,在sklearn的實現(xiàn)中,這個問題可以通過使用PCA初始化點來解決,PCA是專門為保持全局結(jié)構(gòu)而構(gòu)建的。

t-SNE也可在sklearn中實現(xiàn):

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結(jié)果不好時,應考慮以下幾點:

作為健全性檢查,嘗試對數(shù)據(jù)運行PCA以將其減少到二維。如果這也給出了糟糕的結(jié)果,那么也許你的數(shù)據(jù)在一開始就沒有很好的結(jié)構(gòu)。如果PCA很好,但t-SNE不行,我很肯定你做錯了什么。

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

就像一個蘋果也是一個水果(泛化)的對象一樣,如果某個事物不能產(chǎn)生與它的泛化相似的結(jié)果,那么通常就是錯誤的。另一方面,如果這兩種方法都失敗了,數(shù)據(jù)很可能很難建模。

關鍵點
  • 由于PCA是線性的,所以不能對非線性關系進行建模。

  • 非線性關系常常出現(xiàn)在數(shù)據(jù)集中,因為像光照或傾斜可以在歐幾里德空間中非線性移動同一類的數(shù)據(jù)點。

  • 流形學習試圖將PCA推廣到各種數(shù)據(jù)集結(jié)構(gòu)上進行降維,其主要思想是流形或連續(xù)曲面的建模應保持局部距離優(yōu)先于全局距離。

  • Isomap試圖保持流形曲面測量的距離,即不是在歐幾里德空間的距離。

  • 局部線性嵌入可以看作是將流形表示為若干個線性塊,其中PCA在其中執(zhí)行。

  • t-SNE采用了更多的“聚類”方法,而不是“展開”方法,但仍然像其他流形學習算法一樣,通過使用概率和t分布來優(yōu)先保持局部距離。

感謝各位的閱讀,以上就是“Isomap在Python中怎么實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Isomap在Python中怎么實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!

本文標題:Isomap在Python中怎么實現(xiàn)
文章源于:http://muchs.cn/article12/ishgdc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供電子商務、搜索引擎優(yōu)化、品牌網(wǎng)站制作、Google、響應式網(wǎng)站、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設計公司