局部线性嵌入(LLE)算法的详细推导及Python实现

  局部线性嵌入(Local Linear Embedding, LLE)算法是一种经典的流形学习算法,不同于等度量映射(Isometric Mapping, Isomap)算法考虑结点的全局连接信息,LLE算法只考虑每个结点的k近邻信息,所以速度比Isomap快很多。LLE的思想如下图所示,LLE在低维空间保持了原始高维空间样本邻域内的线性关系,这也是局部线性的一个最直接的解释:高维数据在局部上具有欧式空间的性质,满足线性相关性。
在这里插入图片描述
  给定LLE算法的输入 χ = { x 1 , x 2 , . . . , x N } ∈ R D × N \chi=\{x_1, x_2,...,x_N\}\in R^{D\times N} χ={x1,x2,...,xN}RD×N,其中 x i ∈ R D × 1 , i = 1 , . . . , N x_i\in R^{D\times1},i=1,...,N xiRD×1,i=1,...,N,即有 N N N个样本,每个样本都是维度为 D D D的列向量。算法输出为 Y = { y 1 , y 2 , . . . , y N } ∈ R d × N Y=\{y_1, y_2,...,y_N\}\in R^{d\times N} Y={y1,y2,...,yN}Rd×N,其中 d < D d<D d<D y i ∈ R d × 1 , i = 1 , . . . , N y_i\in R^{d\times1},i=1,...,N yiRd×1,i=1,...,N。假定原始输入空间的向量 x i x_i xi满足 x i = ∑ j = 1 k w j i x j i x_i=\sum_{j=1}^k w_{ji}x_{ji} xi=j=1kwjixji x j i x_{ji} xji x i x_i xi的第 j j j个近邻点, w j i ∈ ( 0 , 1 ) w_{ji}\in(0,1) wji(0,1)为权重,那么LLE算法认为在低维空间同样应该保持上述线性关系: y i = ∑ j = 1 k w j i y j i y_i=\sum_{j=1}^k w_{ji}y_{ji} yi=j=1kwjiyji,所以LLE算法的核心就是如何根据高维空间的邻域线性关系求解具有同邻域线性关系的低维流形嵌入。
  首先看高维空间。LLE算法第一步是求出原始输入空间的每个样本与其邻域的线性关系,即 arg ⁡ min ⁡ W ∑ i = 1 N ∥ x i − ∑ j = 1 k w j i x j i ∥ 2 \mathop{\arg\min}_{W} \sum_{i=1}^N \| x_i-\sum_{j=1}^k w_{ji}x_{ji} \|^2 argminWi=1Nxij=1kwjixji2 s . t .   ∑ j = 1 k w j i = 1 s.t. \ \sum_{j=1}^k w_{ji}=1 s.t. j=1kwji=1 Φ ( W ) = ∑ i = 1 N ∥ x i − ∑ j = 1 k w j i x j i ∥ 2 = ∑ i = 1 N ∥ ∑ j = 1 k ( x i − x j i ) w j i ∥ 2 = ∑ i = 1 N ∥ ( X i − N i ) W i ∥ 2 = ∑ i = 1 N W i T ( X i − N i ) T ( X i − N i ) W i \begin{aligned} \Phi(W) &= \sum_{i=1}^N \| x_i-\sum_{j=1}^k w_{ji}x_{ji} \|^2 \\ &= \sum_{i=1}^N \| \sum_{j=1}^k (x_i-x_{ji}) w_{ji} \|^2 \\ &= \sum_{i=1}^N \| (X_i-N_i)W_i \|^2 \\ &= \sum_{i=1}^N W_i ^T(X_i-N_i)^T(X_i-N_i)W_i \end{aligned} Φ(W)=i=1Nxij=1kwjixji2=i=1Nj=1k(xixji)wji2=i=1N(XiNi)Wi2=i=1NWiT(XiNi)T(XiNi)Wi s . t .    W i T 1 k = 1 s.t. \ \ W_i^T \boldsymbol {1}_k=1 s.t.  WiT1k=1 其中 X i , N i ∈ R D × k , W i ∈ R k × 1 X_i,N_i\in R^{D\times k},W_i\in R^{k\times 1} Xi,NiRD×k,WiRk×1。记 S = ( X i − N i ) T ( X i − N i ) ∈ R k × k S=(X_i-N_i)^T(X_i-N_i) \in R^{k\times k} S=(XiNi)T(XiNi)Rk×k,则上述优化目标变成了: Φ ( W ) = ∑ i = 1 N W i T S W i \Phi(W)= \sum_{i=1}^N W_i ^TSW_i Φ(W)=i=1NWiTSWi s . t .    W i T 1 k = 1 s.t. \ \ W_i^T \boldsymbol {1}_k=1 s.t.  WiT1k=1 写出该优化目标的拉格朗日方程: L = W i T S W i + λ ( W i T 1 k − 1 ) L=W_i ^TSW_i + \lambda (W_i^T \boldsymbol {1}_k-1) L=WiTSWi+λ(WiT1k1) L L L W i W_i Wi的偏导数,并令其等于零: ∂ L ∂ W i = 2 S W i + λ 1 k = 0 \frac{\partial L}{\partial W_i} =2SW_i+\lambda \boldsymbol {1}_k=0 WiL=2SWi+λ1k=0 则可以求出 W i W_i Wi W i = S i − 1 1 k 1 k T S i − 1 1 k W_i=\frac{S_i^{-1} \boldsymbol {1}_k}{\boldsymbol {1}_k ^TS_i^{-1} \boldsymbol {1}_k} Wi=1kTSi11kSi11k 上式中的分母 1 k T S i − 1 1 k \boldsymbol {1}_k ^TS_i^{-1} \boldsymbol {1}_k 1kTSi11k是为了对 W i ∈ R k × 1 W_i \in R^{k \times 1} WiRk×1进行归一化,使得 W i W_i Wi各维度之和为1,所以这里可以忽略系数 λ \lambda λ,总体的权重系数 W W W矩阵为 W = { W 1 , W 2 , . . . , W N } ∈ R k × N W=\{ W_1, W_2,...,W_N \} \in R^{k \times N} W={W1,W2,...,WN}Rk×N
  然后看低维空间 Y = { y 1 , y 2 , . . . , y N } ∈ R d × N Y=\{y_1, y_2,...,y_N\}\in R^{d\times N} Y={y1,y2,...,yN}Rd×N Y Y Y的每一列都是一个样本,样本长度为 d d d,共 N N N个样本,因为低维空间要保证局部线性与原始输入空间相同,所以可以表示为: arg ⁡ min ⁡ Y ∑ i = 1 N ∥ y i − ∑ j = 1 k w j i y j i ∥ 2 \mathop{\arg\min}_{Y} \sum_{i=1}^N \| y_i-\sum_{j=1}^k w_{ji}y_{ji} \|^2 argminYi=1Nyij=1kwjiyji2 s . t .   ∑ i = 1 N y i = 0 ∑ i = 1 N y i y i T = N I d × d \begin{aligned} s.t. \ & \sum_{i=1}^N y_i=0 \\ & \sum_{i=1}^N y_i y_i^T=NI_{d \times d} \end{aligned} s.t. i=1Nyi=0i=1NyiyiT=NId×d 这里有两个约束条件,第一个是说 Y Y Y被中心化,所有的样本在同一个维度上的数值之和为0,第二个约束条件指的是 Y Y Y中的低维样本 y i y_i yi都是单位向量。现建立稀疏矩阵 W ′ = { w i j ′ } ∈ R N × N W'=\{ w'_{ij} \} \in R^{N \times N} W={wij}RN×N,且 w i j ′ = { w i j ,     x j ∈ k N N ( x i ) 0 ,         o t h e r w i s e w'_{ij}=\left\{ \begin{aligned} &w_{ij}, \ \ \ x_j \in kNN(x_i)\\ &0, \ \ \ \ \ \ \ otherwise\\ \end{aligned} \right. wij={wij,   xjkNN(xi)0,       otherwise 因此, ∑ j = 1 N w j i ′ y j i = ∑ j = 1 k w j i y j i = Y W i ′ \sum_{j=1}^N w'_{ji}y_{ji} = \sum_{j=1}^k w_{ji}y_{ji} = YW'_i j=1Nwjiyji=j=1kwjiyji=YWi 上式中, Y ∈ R d × N Y \in R^{d \times N} YRd×N每一列代表一个样本, W i ′ ∈ R N × 1 W '_i\in R^{N \times 1} WiRN×1为矩阵 W ′ W' W的列向量,得到的结果刚好是 y i ∈ R d × 1 y_i \in R^{d \times 1} yiRd×1。记 Φ ( Y ) = ∑ i = 1 N ∥ y i − ∑ j = 1 k w j i y j i ∥ 2 = ∑ i = 1 N ∥ Y ( I i − W i ′ ) ∥ 2 = ∑ i = 1 N [ Y ( I i − W i ′ ) ( I i − W i ′ ) T Y T ] = t r ( Y ( I − W ′ ) ( I − W ′ ) T Y T ) \begin{aligned} \Phi(Y) &= \sum_{i=1}^N \| y_i-\sum_{j=1}^k w_{ji}y_{ji} \|^2 \\ &= \sum_{i=1}^N \| Y(I_i-W'_i) \|^2 \\ &= \sum_{i=1}^N [Y(I_i-W'_i)(I_i-W'_i)^TY ^T] \\ &= tr(Y(I-W')(I-W')^TY ^T) \end{aligned} Φ(Y)=i=1Nyij=1kwjiyji2=i=1NY(IiWi)2=i=1N[Y(IiWi)(IiWi)TYT]=tr(Y(IW)(IW)TYT) 这里用到了矩阵的一个技巧,假定 A = [ a 1 , a 2 , , . . . , a n ] A=[a_1, a_2, ,...,a_n] A=[a1,a2,,...,an] a n ∈ R d × 1 a_n \in R^{d \times 1} anRd×1为列向量,则 ∑ i = 1 N a i 2 = ∑ i = 1 N a i T a i = t r ( A A T ) \sum_{i=1}^N a_i^2 = \sum_{i=1}^N a_i^T a_i = tr(AA^T) i=1Nai2=i=1NaiTai=tr(AAT)(结果最后为一个数值,即 ∑ i = 1 d ∑ j = 1 N A i j 2 \sum_{i=1}^d \sum_{j=1}^N A_{ij}^2 i=1dj=1NAij2),可以使用三元数组举一个toy problem,篇幅所限就不列举出来了。所以同样, ∑ i = 1 N y i T y i = t r ( Y Y T ) \sum_{i=1}^N y_i^T y_i = tr(YY^T) i=1NyiTyi=tr(YYT)。令 M = ( I i − W i ′ ) ( I i − W i ′ ) T ∈ R N × N M=(I_i-W'_i)(I_i-W'_i)^T\in R^{N \times N} M=(IiWi)(IiWi)TRN×N,则优化问题可写为: m i n    Φ ( Y ) = t r ( Y M Y T ) min \ \ \Phi(Y)=tr(YMY^T) min  Φ(Y)=tr(YMYT) s . t .    t r ( Y Y T − N I d × d ) = 0 s.t. \ \ tr(YY^T-NI_{d \times d})=0 s.t.  tr(YYTNId×d)=0 写出拉格朗日方程: L = t r [ Y M Y T + λ ( Y Y T − N I d × d ) ] L=tr[YMY^T+\lambda(YY^T-NI_{d \times d})] L=tr[YMYT+λ(YYTNId×d)] Y Y Y求导并令其等于零,则可以得到 M Y T + 2 λ Y T = 0 MY_T+2 \lambda Y_T=0 MYT+2λYT=0 M Y T = λ ′ Y T MY_T=\lambda' Y_T MYT=λYT 最后,要得到降维后的 d d d维数据集,只需要取矩阵 M M M最小的 d d d个特征值对应的特征向量组成的矩阵 Y ∈ R d × N Y \in R^{d\times N} YRd×N,由于 M M M最小的特征值一般为 0 0 0,所以去掉最小的特征值,选择 M M M的第 2 2 2到第 d + 1 d+1 d+1特征值对应的特征向量。这里分析一下为什么 M M M最小的特征值为 0 0 0:矩阵 W ′ W' W的每一列的和都为 1 1 1,那么有 W ′ T 1 N = 1 N W'^T \boldsymbol {1}_N = \boldsymbol {1}_N WT1N=1N,这里的 1 N \boldsymbol {1}_N 1N指的是长度为 N N N的全 1 1 1列向量,所以有 ( W ′ T − I ) 1 N = 0 (W'^T-I) \boldsymbol {1}_N=0 (WTI)1N=0,即 W ′ T − I W'^T-I WTI为奇异矩阵,所以 M M M也是奇异矩阵,也就是说 0 0 0 M M M的一个特征值。
  然后把代码贴出来,详细代码见我的GitHub,首先是求距离矩阵然后计算K近邻的索引:

def cal_pairwise_dist(data):
	expand_ = data[:, np.newaxis, :]
	repeat1 = np.repeat(expand_, data.shape[0], axis=1)
	repeat2 = np.swapaxes(repeat1, 0, 1)
	D = np.linalg.norm(repeat1 - repeat2, ord=2, axis=-1, keepdims=True).squeeze(-1)
	return D
	
def get_n_neighbors(data, n_neighbors=10):
	dist = cal_pairwise_dist(data)
	dist[dist < 0] = 0
	n = dist.shape[0]
	N = np.zeros((n, n_neighbors))
	for i in range(n):
		# np.argsort 列表从小到大的索引
		index_ = np.argsort(dist[i])[1:n_neighbors+1]
		N[i] = N[i] + index_
	return N.astype(np.int32)                         # [n_features, n_neighbors]

然后是LLE算法的核心:

def lle(data, n_dims=2, n_neighbors=10):
	N = get_n_neighbors(data, n_neighbors)            # k近邻索引
	n, D = data.shape                                 # n_samples, n_features
	# prevent Si to small
	if n_neighbors > D:
		tol = 1e-3
	else:
		tol = 0
	# calculate W
	W = np.zeros((n_neighbors, n))
	I = np.ones((n_neighbors, 1))
	for i in range(n):                                # data[i] => [1, n_features]
		Xi = np.tile(data[i], (n_neighbors, 1)).T     # [n_features, n_neighbors]
		                                              # N[i] => [1, n_neighbors]
		Ni = data[N[i]].T                             # [n_features, n_neighbors]
		Si = np.dot((Xi-Ni).T, (Xi-Ni))               # [n_neighbors, n_neighbors]
		Si = Si + np.eye(n_neighbors)*tol*np.trace(Si)
		Si_inv = np.linalg.pinv(Si)
		wi = (np.dot(Si_inv, I)) / (np.dot(np.dot(I.T, Si_inv), I)[0,0])
		W[:, i] = wi[:,0]
	W_y = np.zeros((n, n))
	for i in range(n):
		index = N[i]
		for j in range(n_neighbors):
			W_y[index[j],i] = W[j,i]
	I_y = np.eye(n)
	M = np.dot((I_y - W_y), (I_y - W_y).T)
	eig_val, eig_vector = np.linalg.eig(M)
	index_ = np.argsort(np.abs(eig_val))[1:n_dims+1]
	Y = eig_vector[:, index_]
	return Y

  最后贴一张实验效果图,瑞士卷降维的:
在这里插入图片描述

<think>好的,我现在需要帮助用户理解流形学习中的LLE算法原理和实现。首先,我得回忆一下LLE的基本概念和相关知识。根据用户提供的引用资料,LLE局部线性嵌入算法,属于流形学习的局部方法,用于非线性降维。它的核心思想是保持局部线性结构,将高维数据映射到低维空间。 首先,我需要整理LLE的步骤。根据引用[2],LLE分为三步:找近邻、计算权重系数、重构低维数据。接下来,我要详细解释每个步骤的原理,可能需要涉及数学公式,比如权重系数的最小化问题,以及低维嵌入的特征值分解方法。这时候需要注意使用正确的LaTeX格式,比如用$...$包裹行内公式,独立公式用$$...$$。 然后,实现部分可能需要用伪代码或者Python示例。但用户没有要求具体代码,所以可能只需要描述实现的关键点,比如选择近邻数k、正则化处理奇异矩阵等。同时,用户提供的引用里有MATLAB实现的例子(引用[3]),可能需要提到这一点,但主要用Python会更通用。 另外,引用[4]提到了推导过程,可以引导用户参考刘建平Pinard的博客,这可以作为扩展阅读。同时,需要确保引用标识正确,比如在适当的位置添加[^2]、[^3]等。 还要考虑用户可能的疑问,比如LLE与其他方法(如ISOMAP)的区别,或者参数k的选择影响。不过用户的问题集中在原理和实现,所以需要紧扣主题。要检查是否覆盖了所有关键点,比如局部线性、权重计算、低维重构,以及特征值问题。 最后,生成相关问题,可能需要围绕LLE的优化、应用、参数选择、与其他方法比较等方面提问。确保问题有针对性,帮助用户进一步学习。 现在需要组织语言,结构清晰,分步骤解释原理,然后讨论实现要点,最后列出相关问题。注意使用中文,避免专业术语过于密集,适当解释概念。同时,确保所有数学表达式符合格式要求,比如$W_{ij}$,$\sum_{j=1}^{k} W_{ij}=1$,以及重构误差的公式使用独立公式块。</think>### 流形学习LLE算法原理及实现 #### 一、LLE算法原理 局部线性嵌入(Locally Linear Embedding, LIE)是一种基于**局部线性假设**的非线性降维方法,核心思想是**高维流形局部可近似为欧氏空间**,通过保持样本邻域内的线性关系实现低维嵌入。 ##### 1. 算法步骤 1. **寻找近邻** 对每个样本$x_i$,计算其k个最近邻(常用欧氏距离或余弦相似度),构成邻域集合$N(i)$[^4]。 2. **计算局部权重** 假设$x_i$可由邻域样本线性组合表示,通过最小化重构误差求解权重$W_{ij}$: $$ \min_{W} \sum_{i=1}^{N} \left\| x_i - \sum_{j \in N(i)} W_{ij}x_j \right\|^2 \quad \text{s.t.} \quad \sum_{j} W_{ij} = 1 $$ 该优化问题可通过闭式解(局部协方差矩阵求逆)实现[^4]。 3. **低维嵌入** 保持权重不变,在低维空间(维度d)求解嵌入$y_i$: $$ \min_{Y} \sum_{i=1}^{N} \left\| y_i - \sum_{j \in N(i)} W_{ij}y_j \right\|^2 $$ 该问题等价于求稀疏矩阵$(I-W)^\top(I-W)$的最小d+1个特征值对应的特征向量。 ##### 2. 核心特性 - **局部线性保持**:仅依赖样本邻域结构,无需全局距离计算 - **拓扑稳定性**:对数据密度变化不敏感 - **参数敏感**:邻域数k的选择显著影响结果 --- #### 二、实现要点 ##### 1. 关键步骤实现 ```python import numpy as np from sklearn.neighbors import NearestNeighbors def LLE(X, n_components=2, n_neighbors=5): # 1. 计算近邻 neigh = NearestNeighbors(n_neighbors=n_neighbors+1) neigh.fit(X) indices = neigh.kneighbors(X, return_distance=False)[:,1:] # 2. 计算权重矩阵W W = np.zeros((len(X), len(X))) for i in range(len(X)): X_nbrs = X[indices[i]] - X[i] C = X_nbrs @ X_nbrs.T C += np.eye(n_neighbors) * 1e-3 * np.trace(C) # 正则化 w = np.linalg.solve(C, np.ones(n_neighbors)) W[i, indices[i]] = w / np.sum(w) # 3. 计算低维嵌入 M = (np.eye(len(X)) - W).T @ (np.eye(len(X)) - W) eigvals, eigvecs = np.linalg.eigh(M) return eigvecs[:,1:n_components+1] ``` ##### 2. 实现注意事项 - **正则化处理**:协方差矩阵$C$需添加小量防止奇异(第14行) - **特征值选择**:排除最小特征值0对应的特征向量(第19行) - **复杂度优化**:近邻搜索可使用KD-Tree或Ball-Tree加速 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值