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

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

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

主成分分析是一種強(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ǔ)?。┩ǔS凶銐虻臄?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)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

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

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

廣告

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

成都網(wǎng)頁設(shè)計(jì)公司