溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-12-27 13:48:39 來源:億速云 閱讀:417 作者:iii 欄目:大數(shù)據(jù)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以下是流形學(xué)習(xí)算法的基本假設(shè)或方面:

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

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

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

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

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

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

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

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

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

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

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

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

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

下面是Isomap在Python中的實(shí)現(xiàn)。由于MNIST是一個(gè)非常大的數(shù)據(jù)集,所以你可能只想在前100個(gè)訓(xùn)練示例中使用.fit_transform(X[:100])訓(xùn)練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個(gè)維度,即“成分”
X_transformed = embedding.fit_transform(X) #擬合模型及變換

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

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

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

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

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

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

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

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

  • 在中心聚集點(diǎn)的趨勢(shì)較小。

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

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

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

然而,t-SNE也有一些缺點(diǎn):

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

  • 該算法利用隨機(jī)性(隨機(jī)性)選取種子,如果種子放置不當(dāng),會(huì)增加算法的運(yùn)行時(shí)間,降低性能。

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

t-SNE也可在sklearn中實(shí)現(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說,當(dāng)t-SNE結(jié)果不好時(shí),應(yīng)考慮以下幾點(diǎn):

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

他為什么這么說?流形學(xué)習(xí)不是PCA的另一種變體,而是一種泛化。在PCA中表現(xiàn)良好的東西幾乎可以保證在t-SNE或其他流形學(xué)習(xí)技術(shù)中表現(xiàn)良好,因?yàn)樗鼈兪欠夯?/p>

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

關(guān)鍵點(diǎn)
  • 由于PCA是線性的,所以不能對(duì)非線性關(guān)系進(jìn)行建模。

  • 非線性關(guān)系常常出現(xiàn)在數(shù)據(jù)集中,因?yàn)橄窆庹栈騼A斜可以在歐幾里德空間中非線性移動(dòng)同一類的數(shù)據(jù)點(diǎn)。

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

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

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

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

感謝各位的閱讀,以上就是“Isomap在Python中怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Isomap在Python中怎么實(shí)現(xiàn)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI