降维方法之LLE——Locally Linear Embedding及其拓展(上)

LLE(Locally Linear Embedding):局部线性嵌入

思想:在嵌入空间中拟合流行的局部结构

LLE的拓展——KLLE(kernel LLE)、ILLE(inverse LLE)、incremental LLE(增量局部线性嵌入)、Landmark LLE(界标局部线性嵌入)、Supervised LLE(SLLE监督局部线性嵌入)、enhanced SLLE、SLLE projection、probabilistic SLLE、supervised guided SLLE、Robust LLE(利用最小二乘法和惩罚函数)、ISOLLE(与Isomap方法融合)等

最为重要的是weighted LLE(加权LLE)

选择邻域数的方法——残差方差、Procrustes统计量、保邻域误差和局部邻域选择

1.LLE(Locally Linear Embedding)

LLE首次提出在2000年,2000-2003年间有所发展,到2006年文章中提出有三步骤:

(1)找到所有训练点中的k-最近邻图

(2)使用线性组合找到用于通过相邻点重建每个点的权重(即找权重值)

(3)使用找到的相同权重,通过嵌入相邻点的线性组合嵌入每个点(即一个高维到低维的嵌入转换),可以理解为在高维空间中点之间的权重在落入低维嵌入空间后仍旧保持不变的权重

step1:找点(如图1)

计算二维空间上的欧氏距离python代码

def EuclideanDistance(x, y):

    import numpy as np

    x = np.array(x)

    y = np.array(y)

    return np.sqrt(np.sum(np.square(x-y)))

step2:计算权重(w)

线性重构后每个点的权重总和都为1,因为防止权重爆炸问题,正负权重的相互抵消,最终使得权重总和为1。

根据计算公式可以得到特征值eigenvalue为:

把上面式子里面求出来的eigenvalue代入即可求得权重w为

step3:嵌入

从高维数据X嵌入到低维空间中变成Y,通过公式可知就是在找到Y的替换后的eigenvalue和eigenvector,由此得到嵌入后的数据

因此可以知道,LLE的关键就在于找到eigenvalue。

2.KLLE(Kernel Locally Linear Embedding)

KLLE最先于2012年提出,关键是将数据映射到特征空间(类似于KPCA中讲数据映射到高维特征空间道理类似),并在特征空间中执行LLE的几个步骤,因此关键的点在于找到正确或者是合适kernel函数

step1:找点(变成在特征空间上找)

特征空间上的欧几里得距离计算公式:

根据公式找到点之后就可以在特征空间中构建出kNN图,同LLE道理,也能在特征空间中找到k个相邻点。

step2:计算权重(相邻重构)

由(22)公式可以知道,最后简化后剩下未知的是Ki,因此我们只需要找到K这个核函数,而Ki可以由下面的公式得到:

通过拉格朗日求导后求出eigenvalue特征值 ,再把求出来的特征值带入公式中计算出所有的权重值

step3:嵌入(同LLE的嵌入步骤)

3.Out-of-sample Embedding in LLE

与LLE不同的是该方法是需要找到样本外的点来进行低维嵌入,而不是通过找到相邻点嵌入

在嵌入的方法中与前面不同的是样本外的嵌入是通过特征函数来实现的,因此需要找到正确的特征函数;最后通过Kernel Mapping进行映射

4.Incremental LLE

2005年提出的Incremental LLE是在使用已嵌入的数据来嵌入新接收的数据的方法,来处理实时更新的在线数据

5.Landmark Locally Linear Embedding

由于是LLE处理光谱降维的方法,因此无法处理n>>1的大数据。为了解决这个问题就引入了Landmark LLE方法,使用一些界标的嵌入来近似所有点的嵌入,使用的方法是Nystrom approximation

(1)Nystrom approximation

(2)Kernel approximation

在Nystrom approximation的基础上,Kernel approximation就是将kernel看成是两个嵌入的内积

(3)Locally Linear Landmark(LLL)

先是将n维嵌入数据映射到m维界标,m<<n,然后使用投影矩阵,再去做内积

内容补充——LLE的关键核心代码

1.线性重构关键代码

 

 

G = ((x.dot(ones_vector.T) - X_neighbors).T).dot(x.dot(ones_vector.T) - X_neighbors)
epsilon = 0.0000001
G = G + (epsilon * np.eye(self.n_neighbors))
numinator = (np.linalg.inv(G)).dot(ones_vector)  #分子
denominator = (ones_vector.T).dot(np.linalg.inv(G)).dot(ones_vector) #分母
self.w_linearReconstruction[sample_index, :] = ((1 / denominator) * numinator).ravel()
2.线性嵌入关键代码
temp = np.eye(self.n_samples) - self.W_linearEmbedding
M = (temp.T).dot(temp)
求M的特征值和特征向量
eig_val, eig_vec = np.linalg.eigh(M)
idx = eig_val.argsort()  # sort eigenvalues in ascending order (smallest eigenvalue first)
eig_val = eig_val[idx]
eig_vec = eig_vec[:, idx]

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZX-研一小学僧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值