用scikit-learn研究局部線性嵌入(LLE)

1.?scikit-learn流形學習庫概述

    在scikit-learn中,流形學習庫在sklearn.manifold包中。里面實現的流形學習算法有:

    1)多維尺度變換MDS算法:這個對應的類是MDS。MDS算法希望在降維時在高維里樣本之間的歐式距離關系在低維可以得到保留。由于降維時它需要考慮了樣本的全局歐式距離關系,因此降維計算量很大,現在一般較少使用了。

    2)等距映射ISOMAP算法:這個對應的類是Isomap。?ISOMAP算法使用了樣本間的測地距離來代替歐式距離,此外基本和MDS算法相同。由于降維時它仍然需要考慮了樣本的全局測地距離關系,因此降維計算量很大。

    3)局部線性嵌入LLE算法:這個對應的類是LocallyLinearEmbedding。這個就是我們LLE原理篇里面的算法、除了包含我們原理篇里講到的標準的LLE實現以外,它還支持改進版的LLE算法,包括MLLE,HLLE和LTSA。這三個算法我們在原理篇的第五節有介紹。后面我們會詳細講這個類的參數使用。

    4)拉普拉斯特征映射LE算法:這個對應的類是SpectralEmbedding。這個算法使用了圖論的方法,用樣本構成的無向圖對應的拉普拉斯矩陣作特征分解來降維。具體方法和我們在譜聚類(spectral clustering)原理總結里面講到的基本相同。

    5)t-distributed Stochastic Neighbor Embedding(t-SNE)算法:這個對應的類是TSNE。這個是一個比較新的降維方法。t-SNE希望樣本間的在高維對應的高斯核函數相似度在低維可以得到保留,即低維和高維有盡量一樣的相似度矩陣。

    這些算法基本原理很類似,都基于流形降維后保持樣本之間的某一個特定的關系而產生。下面我們重點講述LLE算法的使用,即LocallyLinearEmbedding的使用。

2. LLE算法類庫使用介紹

    LLE算法類LocallyLinearEmbedding使用起來并不復雜,一般來說,需要調參的參數只有樣本近鄰的個數。下面我們對LocallyLinearEmbedding的主要參數做一個介紹。

    1)n_neighbors:即我們搜索樣本的近鄰的個數,默認是5。 n_neighbors個數越大,則建立樣本局部關系的時間會越大,也就意味著算法的復雜度會增加。當然n_neighbors個數越大,則降維后樣本的局部關系會保持的更好。在下一節我們可以通過具體的例子看出這一點。一般來說,如果算法運行時間可以接受,我們可以盡量選擇一個比較大一些的n_neighbors。

    2)n_components:即我們降維到的維數。如果我們降維的目的是可視化,則一般可以選擇2-5維。

    3)?reg?:正則化系數,在n_neighbors大于n_components時,即近鄰數大于降維的維數時,由于我們的樣本權重矩陣不是滿秩的,LLE通過正則化來解決這個問題。默認是0.001。一般不用管這個參數。當近鄰數遠遠的大于降維到的維數時可以考慮適當增大這個參數。

    4)eigen_solver:特征分解的方法。有‘arpack’和‘dense’兩者算法選擇。當然也可以選擇'auto'讓scikit-learn自己選擇一個合適的算法。‘arpack’和‘dense’的主要區別是‘dense’一般適合于非稀疏的矩陣分解。而‘arpack’雖然可以適應稀疏和非稀疏的矩陣分解,但在稀疏矩陣分解時會有更好算法速度。當然由于它使用一些隨機思想,所以它的解可能不穩定,一般需要多選幾組隨機種子來嘗試。

    5)method: 即LLE的具體算法。LocallyLinearEmbedding支持4種LLE算法,分別是'standard'對應我們標準的LLE算法,'hessian'對應原理篇講到的HLLE算法,'modified'對應原理篇講到的MLLE算法,‘ltsa’對應原理篇講到的LTSA算法。默認是'standard'。一般來說HLLE/MLLE/LTSA算法在同樣的近鄰數n_neighbors情況下,運行時間會比標準的LLE長,當然降維的效果會稍微好一些。如果你對降維后的數據局部效果很在意,那么可以考慮使用HLLE/MLLE/LTSA或者增大n_neighbors,否則標準的LLE就可以了。需要注意的是使用MLLE要求n_neighbors > n_components,而使用HLLE要求n_neighbors > n_components * (n_components + 3) / 2

    6)neighbors_algorithm:這個是k近鄰的搜索方法,和KNN算法的使用的搜索方法一樣。算法一共有三種,第一種是蠻力實現,第二種是KD樹實現,第三種是球樹實現。這三種方法在K近鄰法(KNN)原理小結中都有講述,如果不熟悉可以去復習下。對于這個參數,一共有4種可選輸入,‘brute’對應第一種蠻力實現,‘kd_tree’對應第二種KD樹實現,‘ball_tree’對應第三種的球樹實現, ‘auto’則會在上面三種算法中做權衡,選擇一個擬合最好的最優算法。需要注意的是,如果輸入樣本特征是稀疏的時候,無論我們選擇哪種算法,最后scikit-learn都會去用蠻力實現‘brute’。個人的經驗,如果樣本少特征也少,使用默認的 ‘auto’就夠了。 如果數據量很大或者特征也很多,用"auto"建樹時間會很長,效率不高,建議選擇KD樹實現‘kd_tree’,此時如果發現‘kd_tree’速度比較慢或者已經知道樣本分布不是很均勻時,可以嘗試用‘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
復制代碼

    我們接著生成隨機數據,由于LLE必須要基于流形不能閉合,因此我們生成了一個缺一個口的三維球體。生成數據并可視化的代碼如下:

復制代碼
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)
復制代碼

    我們可以看到原始的數據是這樣的:

    現在我們簡單的嘗試用LLE將其從三維降為2維并可視化,近鄰數設為30,用標準的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維后,我們大概還是可以看出這是一個球體。

    現在我們看看用不同的近鄰數時,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()
復制代碼

    效果圖如下:

    現在我們看看還是這些k近鄰數,用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()
復制代碼

    輸出如下:

    可見在同樣的近鄰數的時候,HLLE降維后的數據分布特征效果要比LLE更好。

    我們接著看看MLLE和LTSA的效果。由于代碼類似,這里就只給出效果圖。

    首先是MLLE的效果圖:

    接著是LTSA的效果圖:

    從上面的一系列圖也可以看出,同樣的k-近鄰數情況下, MLLE,HLLE和LTSA降維的可視化效果更好。同樣的算法,k-近鄰數越大則降維可視化效果越好。當然,沒有免費的午餐,較好的降維可視化效果意味著更多的算法運行時間。


本文轉自劉建平Pinard博客園博客,原文鏈接:http://www.cnblogs.com/pinard/p/6273377.html,如需轉載請自行聯系原作者


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256234.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256234.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256234.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

判斷字符串中是否為數字的三種方法

//1用JAVA自帶的函數 public static boolean isNumeric(String str){for (int i str.length();--i>0;){ if (!Character.isDigit(str.charAt(i))){return false;}}return true;}//2用正則表達式 public static boolean isNumeric(String str){ Pattern pattern Pattern.…

【圖像處理】——Python+opencv實現圖像的hu不變矩特征提取(含原理、推導過程、應用、代碼等)

目錄 轉載本文請注明詳細地址本文介紹了矩和圖像矩的含義本文介紹了不變矩的計算、應用本文介紹了如何計算圖像相似度一、思維導圖 二、普通矩的定義 1、零階矩 2、二階矩

MSSQL-to-MySQL v5.3, 從MSSQL遷移到mySQL的最佳工具

將現有的MSSQL數據庫遷移到MySQL數據庫,嘗試了很多種工具 MySQL Workbench / MSSQL to MySQL Export / DB Converter / openDBcopy 都有這樣那樣的問題。 最后發現就MSSQL-to-MySQL好一點&#xff0c;能夠保證所有表和數據成功遷移&#xff0c;并且字段類型都比較正確。 只是對…

C#窗體應用程序崩潰解決方法總結

一、內存不足 內存是最常見的導致程序崩毀的原因&#xff0c;常用解決方式有如下幾種。 算法中聲明的占內存較大的全局變量或類中聲明的私有變量在循環或運行結束后需進行釋放&#xff0c;手動設置Dispose()&#xff0c;然后GC.Collect()。對一些重復調用的類避免多次實例化。…

【學習的心得】——“快餐”的效率與“挖掘”的重要性

從事Python圖像處理和機器學習方向已經有大半年了&#xff0c;現在作為還是一個研究生的我&#xff0c;大部分時間都是在完成老師給的課題任務&#xff0c;但是這幾個月下來我感覺和老師的意見有點分歧了甚至跟一些同學都有所意見分歧了。 Python雖然是最近幾年火起來的語言&a…

Unity3D Input按鍵系統

默認輸入軸&#xff1a; Horizontal 和 Vertical被映射到w, a, s, d鍵和方向鍵 Fire1, Fire2, Fire3被分別映射到Ctrl&#xff0c;Option&#xff08;Alt&#xff09;和Command鍵 Mouse X 和 Mouse Y被映射到鼠標移動增量 Window Shake X 和 Window Shake Y 被映射到窗口的移動…

iOS app 企業內部發布及HTTPS服務器配置

轉自: http://www.cnblogs.com/cocoajin/p/4082488.html iOS企業內部發布及HTTPS服務器配置 一&#xff1a;所需的條件 1. 蘋果開發者證書&#xff0c;企業版 299$ 版本 2. ssl 證書&#xff0c;即https使用的服務器證書 3. web服務器&#xff0c;支持https 4. 一個域名&#x…

Pytorch超簡單安裝教程

安裝Pytorch 1.1 安裝Annaconda 安裝Pytorch首先需要安裝Annaconda&#xff0c;按照教程&#xff0c;安裝了Annaconda5.2.0的版本。 路徑 記住安裝路徑即可&#xff0c;其余均選默認。 1.2 安裝Pytorch 第一步&#xff0c;打開Anaconda Prompt 。然后輸入 conda create -n…

【圖像處理】——紋理特征提取方法(LBP局部二值模式和GLCM灰度共生矩陣)

紋理特征提取方法 局部二值模式(LBP) (結構法) Local binary patterns 原理 將像素點的鄰域八個像素點與中心像素點值進行比較,大于設為1,小于設為0,這樣就會得到一個鄰域值為1和0的格子,將這八個值按照一定的規則排列成一個二進制的數字,并且轉換為十進制作為中心像…

44. 源代碼解讀-RocketMQ-架構

1. 前言 1.1 github源代碼 https://github.com/apache/rocketmq 1.2 github其他客戶端&#xff0c;比如c,php https://github.com/apache/rocketmq-externals 1.3 運行進程 RocketMQ分成兩個進程運行 NamesrvBrokerNamesrv&#xff0c;命名服務&#xff0c;主要負責Broker狀態管…

jquery檢測瀏覽器類型

使用jquery如下代碼檢測瀏覽器版本時&#xff1a;出問題&#xff0c;在檢測IE瀏覽器&#xff0c;如果版本是IE11時&#xff0c;會出現 $.browser.msie的返回值是false&#xff0c;$.browser.mozilla的返回值是true&#xff0c;即把IE11檢測成火狐了 結局辦法 判斷IE瀏覽器用 …

【leetcode?python】 9. Palindrome Number

#回文數#Method1&#xff1a;將整數轉置和原數比較&#xff0c;一樣就是回文數&#xff1b;負數不是回文數#這里反轉整數時不需要考慮溢出&#xff0c;但不代表如果是C/C等語言也不需要考慮class Solution(object): def isPalindrome(self, x): """ …

Pytorch基礎(一) —— tensorboard的應用

一、簡介與安裝方法 1.1 概念 Tensorboard 是 TensorFlow 的一個工具包&#xff0c;用于展示網絡圖、張量的指標變化和分布情況&#xff0c;如權重W、偏置B、卷積層數、全連接層數等參數&#xff0c;使用該工具可以方便觀察神經網絡訓練過程&#xff0c;分析學習模型訓練的效…

“RuntimeWarning: overflow encountered in ubyte_scalars像素加減運算溢出異常”原因以及解決辦法

轉載本文請注明詳細地址本文介紹了像素點相加減溢出的原因與解決方法 目錄 原因&#xff1a; 解決方法&#xff1a; 原因&#xff1a; 這個問題一般是會出現在圖像處理像素的加減中&#xff0c;出現的原因是因為圖片的像素一般是八位即最大值是256&#xff0c;最小值是0&…

二叉樹重建

一、已知先序遍歷和中序遍歷。求后序遍歷。http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId944 依據先序遍歷和中序遍歷還原二叉樹的主要思想&#xff1a; 1、先序遍歷序列的第一個元素必然是根節點&#xff0c;能夠由此獲取二叉樹的根節點。 2、依據根節點&…

asyn4j -- java 異步方法調用框架

asyn4j 是一個java異步方法調用框架&#xff0c;基于消費者與生產者模式。包括了異步方法執行&#xff0c;異步回調執行&#xff0c;異步工作緩存模塊.支持Spring. 讓我們寫異步方法不再寫很多的相關多線程代碼。用asyn4j輕松搞定異步方法調用.提高程序的響應能力.轉載于:https…

Pytorch基礎(二)—— Transforms詳解

一、概念 Transforms是pytorch的圖像處理工具包&#xff0c;是torchvision模塊下的一個一個類的集合&#xff0c;可以對圖像或數據進行格式變換&#xff0c;裁剪&#xff0c;縮放&#xff0c;旋轉等&#xff0c;在進行深度學習項目時用途很廣泛。下面對Transforms內的常見類的…

圖像基本處理算法的簡單實現(二)

圖像基本處理算法的簡單實現&#xff08;一&#xff09; 圖像基本處理算法的簡單實現&#xff08;二&#xff09; 4&#xff09;膨脹腐蝕 屬于什么心態學&#xff0c;膨脹、腐蝕、擊中/擊不中變換、細化…&#xff08;又暈了T^T&#xff09;。簡單點好像就是集合運算&#xff0…

【WIN10】WIN2D——基本圖形的繪製

DEMO下載地址&#xff1a;http://yunpan.cn/c3iNuHFFAcr8h &#xff08;提取碼&#xff1a;8e48&#xff09; 先看一個截圖&#xff1a; 繪製了一些基本形狀。 DEMO的繪製代碼都非常簡單&#xff0c;不想在博客裡細說了&#xff0c;看代碼更為清晰些。 可能繪製扇形的代碼有些麻…