局部線性嵌入 (Locally linear embedding)是一種非線性降維算法,它能夠使降維后的數據較好地保持原有 流形結構 。LLE可以說是流形學習方法最經典的工作之一。很多后續的流形學習、降維方法都與LLE有密切聯系。
如下圖,使用LLE將三維數據(b)映射到二維(c)之后,映射后的數據仍能保持原有的數據流形(紅色的點互相接近,藍色的也互相接近),說明LLE有效地保持了數據原有的流行結構。
但是LLE在有些情況下也並不適用,如果數據分布在整個封閉的球面上,LLE則不能將它映射到二維空間,且不能保持原有的數據流形。那么我們在處理數據中,首先假設數據不是分布在閉合的球面或者橢球面上。
LLE算法認為每一個數據點都可以由其近鄰點的線性加權組合構造得到。算法的主要步驟分為三步:
- 1、尋找每個樣本點的k個近鄰點;
- 2、由每個 樣本點的近鄰點計算出該樣本點的局部重建權值矩陣;
- 3、由該樣本點的局部重建權值矩陣和其近鄰點計算出該樣本點的輸出值。
理解:對於圖像X中每一個塊X1
- 第一步是計算出每個樣本點Xi的k個近鄰點,即找出樣本點的近鄰域集合,此處計算可以通過歐幾里德距離法求;
- 第二步是計算出樣本點的局部重建權值矩陣W來使得重構塊X1的誤差最小化;
- 第三步將所有樣本點映射到低維空間中達到降維的目的
其原理解釋可參考:
R實現LLE算法包
R算法包 lle , 參考資料:https://cran.r-project.org/web/packages/lle/index.html
Usage: lle(X, m, k, reg = 2, ss = FALSE, p = 0.5, id = FALSE, nnk = TRUE, eps = 1, iLLE = FALSE, v = 0.99)
- X: 輸入的數據對象
- m: 輸入數據的內在維度,這個參數主要影響結果的可視化,實現的內在維度結果在算法中會自動進行計算
- k: 近鄰個數,K的取值在算法中起到關鍵作用,如果K值太大,LLE不能體現局部特性。使得LLE算法趨向於PCA算法。反之取得太小,LLE便不能保持樣本點在在低維空間中的拓撲結構。可使用
calc_k
. 函數進行計算 - id: 邏輯變量,定義是否進行內存維度計算
Usage: calc_k(X, m, kmin=1, kmax=20, plotres=TRUE,parallel=FALSE, cpus=2, iLLE=FALSE)
- m: 輸入數據的內在維度
- kmin: K最小值
- kmax: K最大值
- plotres:是否plot結果
- parallel: 是否使用並行計算
示例代碼
> remove(list = ls()) > if (require(lle) == FALSE) + { + install.packages("lle") + } > > test <- iris[,1:4] > le <- lle(test,5,20,id=TRUE) finding neighbours calculating weights intrinsic dim: mean=3.96, mode=4 computing coordinates > table(le$id) 3 4 6 144
從上面的結果發現,輸入數據的內在維度為2,再通過calc_k計算最合適的K值
> k <- calc_k(test,2,kmin = 1,kmax = dim(test)[1])
snowfall 1.84-6.1 initialized: sequential execution, one CPU.
如下圖,選擇K值:50
根據計算優化的參數,重新進行數據計算
> le <- lle(test,2,50) finding neighbours calculating weights computing coordinates > newSet <- cbind(iris,as.data.frame(le$Y)) > head(newSet) Sepal.Length Sepal.Width Petal.Length Petal.Width Species V1 V2 1 5.1 3.5 1.4 0.2 setosa 0.5703337 -1.345773 2 4.9 3.0 1.4 0.2 setosa -0.7795944 -1.236492 3 4.7 3.2 1.3 0.2 setosa -0.8186908 -1.311557 4 4.6 3.1 1.5 0.2 setosa -1.2211154 -1.217567 5 5.0 3.6 1.4 0.2 setosa 0.5488266 -1.365494 6 5.4 3.9 1.7 0.4 setosa 1.9528668 -1.289062
結果圖例顯示
library(rgl)
plot_lle(le$Y,test)