用scikit-learn研究局部线性嵌入(LLE)
1.?scikit-learn流形學(xué)習(xí)庫概述
在scikit-learn中,流形學(xué)習(xí)庫在sklearn.manifold包中。里面實現(xiàn)的流形學(xué)習(xí)算法有:
1)多維尺度變換MDS算法:這個對應(yīng)的類是MDS。MDS算法希望在降維時在高維里樣本之間的歐式距離關(guān)系在低維可以得到保留。由于降維時它需要考慮了樣本的全局歐式距離關(guān)系,因此降維計算量很大,現(xiàn)在一般較少使用了。
2)等距映射ISOMAP算法:這個對應(yīng)的類是Isomap。?ISOMAP算法使用了樣本間的測地距離來代替歐式距離,此外基本和MDS算法相同。由于降維時它仍然需要考慮了樣本的全局測地距離關(guān)系,因此降維計算量很大。
3)局部線性嵌入LLE算法:這個對應(yīng)的類是LocallyLinearEmbedding。這個就是我們LLE原理篇里面的算法、除了包含我們原理篇里講到的標(biāo)準(zhǔn)的LLE實現(xiàn)以外,它還支持改進版的LLE算法,包括MLLE,HLLE和LTSA。這三個算法我們在原理篇的第五節(jié)有介紹。后面我們會詳細講這個類的參數(shù)使用。
4)拉普拉斯特征映射LE算法:這個對應(yīng)的類是SpectralEmbedding。這個算法使用了圖論的方法,用樣本構(gòu)成的無向圖對應(yīng)的拉普拉斯矩陣作特征分解來降維。具體方法和我們在譜聚類(spectral clustering)原理總結(jié)里面講到的基本相同。
5)t-distributed Stochastic Neighbor Embedding(t-SNE)算法:這個對應(yīng)的類是TSNE。這個是一個比較新的降維方法。t-SNE希望樣本間的在高維對應(yīng)的高斯核函數(shù)相似度在低維可以得到保留,即低維和高維有盡量一樣的相似度矩陣。
這些算法基本原理很類似,都基于流形降維后保持樣本之間的某一個特定的關(guān)系而產(chǎn)生。下面我們重點講述LLE算法的使用,即LocallyLinearEmbedding的使用。
2. LLE算法類庫使用介紹
LLE算法類LocallyLinearEmbedding使用起來并不復(fù)雜,一般來說,需要調(diào)參的參數(shù)只有樣本近鄰的個數(shù)。下面我們對LocallyLinearEmbedding的主要參數(shù)做一個介紹。
1)n_neighbors:即我們搜索樣本的近鄰的個數(shù),默認(rèn)是5。 n_neighbors個數(shù)越大,則建立樣本局部關(guān)系的時間會越大,也就意味著算法的復(fù)雜度會增加。當(dāng)然n_neighbors個數(shù)越大,則降維后樣本的局部關(guān)系會保持的更好。在下一節(jié)我們可以通過具體的例子看出這一點。一般來說,如果算法運行時間可以接受,我們可以盡量選擇一個比較大一些的n_neighbors。
2)n_components:即我們降維到的維數(shù)。如果我們降維的目的是可視化,則一般可以選擇2-5維。
3)?reg?:正則化系數(shù),在n_neighbors大于n_components時,即近鄰數(shù)大于降維的維數(shù)時,由于我們的樣本權(quán)重矩陣不是滿秩的,LLE通過正則化來解決這個問題。默認(rèn)是0.001。一般不用管這個參數(shù)。當(dāng)近鄰數(shù)遠遠的大于降維到的維數(shù)時可以考慮適當(dāng)增大這個參數(shù)。
4)eigen_solver:特征分解的方法。有‘a(chǎn)rpack’和‘dense’兩者算法選擇。當(dāng)然也可以選擇'auto'讓scikit-learn自己選擇一個合適的算法。‘a(chǎn)rpack’和‘dense’的主要區(qū)別是‘dense’一般適合于非稀疏的矩陣分解。而‘a(chǎn)rpack’雖然可以適應(yīng)稀疏和非稀疏的矩陣分解,但在稀疏矩陣分解時會有更好算法速度。當(dāng)然由于它使用一些隨機思想,所以它的解可能不穩(wěn)定,一般需要多選幾組隨機種子來嘗試。
5)method: 即LLE的具體算法。LocallyLinearEmbedding支持4種LLE算法,分別是'standard'對應(yīng)我們標(biāo)準(zhǔn)的LLE算法,'hessian'對應(yīng)原理篇講到的HLLE算法,'modified'對應(yīng)原理篇講到的MLLE算法,‘ltsa’對應(yīng)原理篇講到的LTSA算法。默認(rèn)是'standard'。一般來說HLLE/MLLE/LTSA算法在同樣的近鄰數(shù)n_neighbors情況下,運行時間會比標(biāo)準(zhǔn)的LLE長,當(dāng)然降維的效果會稍微好一些。如果你對降維后的數(shù)據(jù)局部效果很在意,那么可以考慮使用HLLE/MLLE/LTSA或者增大n_neighbors,否則標(biāo)準(zhǔn)的LLE就可以了。需要注意的是使用MLLE要求n_neighbors > n_components,而使用HLLE要求n_neighbors > n_components * (n_components + 3) / 2
6)neighbors_algorithm:這個是k近鄰的搜索方法,和KNN算法的使用的搜索方法一樣。算法一共有三種,第一種是蠻力實現(xiàn),第二種是KD樹實現(xiàn),第三種是球樹實現(xiàn)。這三種方法在K近鄰法(KNN)原理小結(jié)中都有講述,如果不熟悉可以去復(fù)習(xí)下。對于這個參數(shù),一共有4種可選輸入,‘brute’對應(yīng)第一種蠻力實現(xiàn),‘kd_tree’對應(yīng)第二種KD樹實現(xiàn),‘ball_tree’對應(yīng)第三種的球樹實現(xiàn), ‘a(chǎn)uto’則會在上面三種算法中做權(quán)衡,選擇一個擬合最好的最優(yōu)算法。需要注意的是,如果輸入樣本特征是稀疏的時候,無論我們選擇哪種算法,最后scikit-learn都會去用蠻力實現(xiàn)‘brute’。個人的經(jīng)驗,如果樣本少特征也少,使用默認(rèn)的 ‘a(chǎn)uto’就夠了。 如果數(shù)據(jù)量很大或者特征也很多,用"auto"建樹時間會很長,效率不高,建議選擇KD樹實現(xiàn)‘kd_tree’,此時如果發(fā)現(xiàn)‘kd_tree’速度比較慢或者已經(jīng)知道樣本分布不是很均勻時,可以嘗試用‘ball_tree’。而如果輸入樣本是稀疏的,無論你選擇哪個算法最后實際運行的都是‘brute’。
3. LLE用于降維可視化實踐
下面我們用一個具體的例子來使用scikit-learn進行LLE降維并可視化。
首先我們載入需要的類庫:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D %matplotlib inline from sklearn import manifold, datasets from sklearn.utils import check_random_state我們接著生成隨機數(shù)據(jù),由于LLE必須要基于流形不能閉合,因此我們生成了一個缺一個口的三維球體。生成數(shù)據(jù)并可視化的代碼如下:
n_samples = 500 random_state = check_random_state(0) p = random_state.rand(n_samples) * (2 * np.pi - 0.55) t = random_state.rand(n_samples) * np.pi# 讓球體不閉合,符合流形定義 indices = ((t < (np.pi - (np.pi / 8))) & (t > ((np.pi / 8)))) colors = p[indices] x, y, z = np.sin(t[indices]) * np.cos(p[indices]), \np.sin(t[indices]) * np.sin(p[indices]), \np.cos(t[indices]) fig = plt.figure() ax = Axes3D(fig, elev=30, azim=-20) ax.scatter(x, y, z, c=p[indices], marker='o', cmap=plt.cm.rainbow)我們可以看到原始的數(shù)據(jù)是這樣的:
現(xiàn)在我們簡單的嘗試用LLE將其從三維降為2維并可視化,近鄰數(shù)設(shè)為30,用標(biāo)準(zhǔn)的LLE算法。
train_data = np.array([x, y, z]).T trans_data = manifold.LocallyLinearEmbedding(n_neighbors =30, n_components = 2,method='standard').fit_transform(train_data) plt.scatter(trans_data[:, 0], trans_data[:, 1], marker='o', c=colors)降維到2維后的效果圖如下:
可以看出從三維降到了2維后,我們大概還是可以看出這是一個球體。
現(xiàn)在我們看看用不同的近鄰數(shù)時,LLE算法降維的效果圖,代碼如下:
for index, k in enumerate((10,20,30,40)):plt.subplot(2,2,index+1)trans_data = manifold.LocallyLinearEmbedding(n_neighbors = k, n_components = 2,method='standard').fit_transform(train_data)plt.scatter(trans_data[:, 0], trans_data[:, 1], marker='o', c=colors)plt.text(.99, .01, ('LLE: k=%d' % (k)),transform=plt.gca().transAxes, size=10,horizontalalignment='right') plt.show()效果圖如下:
現(xiàn)在我們看看還是這些k近鄰數(shù),用HLLE的效果。
for index, k in enumerate((10,20,30,40)):plt.subplot(2,2,index+1)trans_data = manifold.LocallyLinearEmbedding(n_neighbors = k, n_components = 2,method='hessian').fit_transform(train_data)plt.scatter(trans_data[:, 0], trans_data[:, 1], marker='o', c=colors)plt.text(.99, .01, ('HLLE: k=%d' % (k)),transform=plt.gca().transAxes, size=10,horizontalalignment='right') plt.show()輸出如下:
可見在同樣的近鄰數(shù)的時候,HLLE降維后的數(shù)據(jù)分布特征效果要比LLE更好。
我們接著看看MLLE和LTSA的效果。由于代碼類似,這里就只給出效果圖。
首先是MLLE的效果圖:
接著是LTSA的效果圖:
從上面的一系列圖也可以看出,同樣的k-近鄰數(shù)情況下, MLLE,HLLE和LTSA降維的可視化效果更好。同樣的算法,k-近鄰數(shù)越大則降維可視化效果越好。當(dāng)然,沒有免費的午餐,較好的降維可視化效果意味著更多的算法運行時間。
本文轉(zhuǎn)自劉建平Pinard博客園博客,原文鏈接:http://www.cnblogs.com/pinard/p/6273377.html,如需轉(zhuǎn)載請自行聯(lián)系原作者
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎
總結(jié)
以上是生活随笔為你收集整理的用scikit-learn研究局部线性嵌入(LLE)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何保护前端JS代码?前端js代码混淆加
- 下一篇: 44. 源代码解读-RocketMQ-架