局部线性嵌入(Locally Linear Embedding,简称LLE)
1 绪论
与Isomap试图保持邻域内样本之间的距离不同,局部线性嵌入(Locally Linear Embedding,LLE)试图保持邻域内样本之间的线性关系。其根本思想可以概括为局部线性重构。
假定样本点 x i x_i xi的坐标能够通过它的邻域样本 x j , x k , x l x_j,x_k,x_l xj,xk,xl进行线性组合而重构出来,即: x i = w i , j x j + w i , k x k + w i , l x l x_i=w_{i,j}x_j+w_{i,k}x_k+w_{i,l}x_l xi=wi,jxj+wi,kxk+wi,lxl。LLE算法希望这种关系在低维空间中得到保持。
2 LLE算法解析
LLE先为每个样本
x
i
x_i
xi找到其近邻下标集合
Q
i
Q_i
Qi,然后计算出基于
Q
i
Q_i
Qi中的样本点对
x
i
x_i
xi进行线性重构的系数
w
i
w_i
wi:
min
w
1
,
w
2
…
w
m
∑
i
=
1
m
∥
x
i
−
∑
j
∈
Q
i
w
i
j
x
i
∥
2
2
\min_{w_1,w_2…w_m}\sum_{i=1}^m\begin{Vmatrix}x_i-\sum_{j\in{Q_i}}w_{ij}x_i\end{Vmatrix}_2^2
w1,w2…wmmini=1∑m∥∥xi−∑j∈Qiwijxi∥∥22
s
.
t
.
∑
j
∈
Q
i
w
i
j
=
1
s.t. \ \sum_{j\in{Q_i}}w_{ij}=1
s.t. j∈Qi∑wij=1
其中
x
i
x_i
xi和
x
j
x_j
xj为已知,令
C
j
k
=
(
x
i
−
x
j
)
T
(
x
i
−
x
k
)
C_jk=(x_i-x_j)^T(x_i-x_k)
Cjk=(xi−xj)T(xi−xk),
w
i
j
w_{ij}
wij有闭式解
w
i
j
=
∑
k
∈
Q
i
C
j
k
−
1
∑
l
,
s
∈
Q
i
C
l
s
−
1
w_{ij}=\frac{\sum_{k\in{Q_i}}C_{jk}^{-1}}{\sum_{{l,s}\in{Q_i}}C_{ls}^{-1}}
wij=∑l,s∈QiCls−1∑k∈QiCjk−1
其中
C
j
k
C_{jk}
Cjk刻画了
x
k
x_k
xk到
x
i
x_i
xi的差向量,与
x
j
x_j
xj到
x
i
x_i
xi的差向量的内积。
w
i
j
w_{ij}
wij刻画了这些内积中,与
x
j
x_j
xj相关的内积的比例。
LLE在低维空间中保持
w
i
w_i
wi不变,于是
x
i
x_i
xi对应的低维空间坐标
z
i
z_i
zi可通过下式求解:
min
z
1
,
z
2
…
z
m
∑
i
=
1
m
∥
z
i
−
∑
j
∈
Q
i
w
i
j
z
i
∥
2
2
\min_{z_1,z_2…z_m}\sum_{i=1}^m\begin{Vmatrix}z_i-\sum_{j\in{Q_i}}w_{ij}z_i\end{Vmatrix}_2^2
z1,z2…zmmini=1∑m∥∥zi−∑j∈Qiwijzi∥∥22
令
Z
=
(
z
1
,
z
2
,
…
,
z
m
)
∈
R
d
′
×
m
,
W
i
j
=
w
i
j
Z=(z_1,z_2,…,z_m)\in{\mathbb{R}^{d'×m}},W_{ij}=w_{ij}
Z=(z1,z2,…,zm)∈Rd′×m,Wij=wij,
M
=
(
I
−
W
)
T
(
I
−
W
)
M=(I-W)^T(I-W)
M=(I−W)T(I−W)
此式可重写为:
min
Z
t
r
(
Z
M
Z
T
)
\min_Ztr(ZMZ^T)
Zmintr(ZMZT)
s
.
t
.
Z
Z
T
=
I
s.t. \ ZZ^T=I
s.t. ZZT=I
则可通过特征值分解求解:
M
M
M最小的
d
′
d'
d′个特征值对应的特征向量组成的矩阵
Z
T
Z^T
ZT。
3 LLE伪码说明
4 以瑞士卷例子来展示LLE算法
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d as p3d
from sklearn import datasets, manifold
from sklearn.datasets import make_swiss_roll
def test_swiss_roll(n_samples=5000):
X, t = make_swiss_roll(n_samples=n_samples, noise=0.2, random_state=42) # X为坐标 t为颜色
# figure1=plt.figure()
axes = [-11.5, 14, -2, 23, -12, 15]
fig = plt.figure()
ax = fig.add_subplot(121, projection='3d')
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=t, cmap=plt.cm.hot)
ax.view_init(10, 60)
ax.set_xlabel("$x$", fontsize=18)
ax.set_ylabel("$y$", fontsize=18)
ax.set_zlabel("$z$", fontsize=18)
ax.set_xlim(axes[0:2])
ax.set_ylim(axes[2:4])
ax.set_zlim(axes[4:6])
plt.title('3D swiss roll')
ax2 = fig.add_subplot(122)
Z = manifold.LocallyLinearEmbedding(n_components=2).fit_transform(X)
ax2.scatter(Z[:, 0], Z[:, 1], c=t, cmap=plt.cm.hot)
plt.title('sklearn LLE')
plt.show()
if __name__ == '__main__':
test_swiss_roll()
程序运行可见:https://aistudio.baidu.com/aistudio/projectdetail/2507328