人工智障學習筆記 機器學習 13 LLE降維

2021-08-13 15:21:35 字數 4430 閱讀 9795

一.概念

lle:locally linear embedding(區域性線性嵌入演算法)是一種非線性降維演算法,它能夠使降維後的資料較好地保持原有流形結構。lle可以說是流形學習方法最經典的工作之一。和傳統的pca,lda等關注樣本方差的降維方法相比,lle關注於降維時保持樣本區域性的線性特徵,由於lle在降維時保持了樣本的區域性特徵。

二.演算法

lle演算法認為每乙個資料點都可以由其近鄰點的線性加權組合構造得到。演算法的主要步驟分為三步:(1)尋找每個樣本點的k個近鄰點;(2)由每個樣本點的近鄰點計算出該樣本點的區域性重建權值矩陣;(3)由該樣本點的區域性重建權值矩陣和其近鄰點計算出該樣本點的輸出值。

三.sklearn提供的api

sklearn的manifold提供了lle方法(locallylinearembedding)

主要引數:

def __init__(self, n_neighbors=5, n_components=2, reg=1e-3,

eigen_solver='auto', tol=1e-6, max_iter=100,

method='standard', hessian_tol=1e-4, modified_tol=1e-12,

neighbors_algorithm='auto', random_state=none, n_jobs=1):

self.n_neighbors = n_neighbors

self.n_components = n_components

self.reg = reg

self.eigen_solver = eigen_solver

self.tol = tol

self.max_iter = max_iter

self.method = method

self.hessian_tol = hessian_tol

self.modified_tol = modified_tol

self.random_state = random_state

self.neighbors_algorithm = neighbors_algorithm

self.n_jobs = n_jobs

n_neighbors:即我們搜尋樣本的近鄰的個數,最重要的就是這個,預設是5。 n_neighbors個數越大,則建立樣本區域性關係的時間會越大,也就意味著演算法的複雜度會增加。當然n_neighbors個數越大,則降維後樣本的區域性關係會保持的更好。在下一節我們可以通過具體的例子看出這一點。一般來說,如果演算法執行時間可以接受,我們可以盡量選擇乙個比較大一些的n_neighbors。

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

reg :正則化係數,在n_neighbors大於n_components時,即近鄰數大於降維的維數時,由於我們的樣本權重矩陣不是滿秩的,lle通過正則化來解決這個問題。預設是0.001。一般不用管這個引數。當近鄰數遠遠的大於降維到的維數時可以考慮適當增大這個引數。

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

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

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』。

例項**:瑞士卷

import numpy as np

import operator

import matplotlib.pyplot as plt

from sklearn import datasets,decomposition,manifold

from itertools import cycle

from mpl_toolkits.mplot3d import axes3d

def load_data():

swiss_roll =datasets.make_swiss_roll(n_samples=1000)

return swiss_roll[0],np.floor(swiss_roll[1])

def lle_components(*data):

x,y=data

for n in [3,2,1]:

lle=manifold.locallylinearembedding(n_components=n)

lle.fit(x)

print("n = %d 重建誤差:"%n,lle.reconstruction_error_)

四.總結

lle演算法計算複雜度相對較小,實現也算比較容易。且可以學習任意維的區域性線性的低維流形。但是對資料的流形分布特徵有嚴格的要求。比如不能是閉合流形,不能是稀疏的資料集,不能是分布不均勻的資料集等等。通過上述**也能看出,演算法對最近鄰樣本數的選擇非常敏感,不同的最近鄰數對最後的降維結果有很大影響。

五.相關學習資源

人工智障學習筆記 機器學習 16 降維小結

機器學習領域中所謂的降維就是指採用某種對映方法,將原高維空間中的資料點對映到低維度的空間中。降維的本質是學習乙個對映函式 f x y,其中x是原始資料點的表達,目前最多使用向量表達形式。y是資料點對映後的低維向量表達,通常y的維度小於x的維度 當然提高維度也是可以的 f可能是顯式的或隱式的 線性的或...

人工智障學習筆記 深度學習 1 神經網路

一.神經網路 我們所說的深度學習,其最基礎最底層的模型稱之為 神經網路 neural network 因為我們希望機器能夠像我們人類大腦的神經網路處理事件一樣去解決問題,最終達到 人工智慧 的效果。二.神經元 神經網路的基本單位叫做神經元,是我們人類思考的基礎。機器模擬的神經元模型是乙個包含輸入,輸...

人工智障學習筆記 深度學習 4 生成對抗網路

概念 生成對抗網路 gan 是一種深度學習模型,是近年來複雜分布上無監督學習最具前景的方法之一。模型通過框架中 至少 兩個模組 生成模型 generative model 和判別模型 discriminative model 的互相博弈學習產生相當好的輸出。判別模型比較好理解,就像分類一樣,有乙個判...