邻域保持嵌入(NPE)
传统的线性降维方法,如主成分分析(PCA)、因子分析(FA)等,关注的是样本的方差,能学习线性流形的结构,却无法学习非线性流形。而经典的流形学习方法虽然能够学习非线性流形结构,但由于本身属于直推学习,无法进行新样本的泛化。另外一些基于核函数的降维方法,如KPCA,尽管可以处理非线性问题,但又忽略了流形的非线性结构。
NPE 作为局部线性嵌入(LLE)算法的线性逼近,它不仅能够捕捉流形的非线性结构,还保留了线性性质,能够进行新样本的泛化。因此,NPE 在效果令人满意的同时,还能够轻松应对新样本,在工业上得到了广泛的应用。
至于流形的问题,如流形是什么,为什么学习流形,可阅读我之前的博客“学习流形”的初认识。
NPE 算法思想及步骤
NPE 的思想和LLE相同,主要是在降维过程中保持流形的局部线性结构不变,从而来提取数据中的有用信息。这里的局部线性结构是通过重构权重矩阵来表征的,而重构权重矩阵就是邻域内邻居点对结点的线性重构的系数矩阵。
和其他经典流形学习算法类似,NPE 的算法步骤主要分为三步:
1. 构建邻域图
利用 K 最近邻(KNN)算法来构建邻域图。假设共有 m 个样本,则邻域图共有 m 个结点,其中 \( \mathbf{x} _ {i} \) 表示第 i 个结点。如果 \( \mathbf{x} _ {j} \) 是 \( \mathbf{x} _ {i} \) 的 k 个最近邻居之一,那么将这两点连接,反之不连接。
2. 计算权重矩阵(提取流形特征)
设权重矩阵为 \(\mathbf{W}\),其中元素 \(W _{ij}\)代表结点 i 和结点 j 之间的边的权重,如果两点之间没有变,则对应的矩阵元素为 0。矩阵 \(\mathbf{W}\) 的元素值主要通过最小化如下目标函数得到:
\]
其中 \(\mathbf{W}\) 应满足归一化约束:
\]
3. 计算映射
通过求解广义特征向量问题来计算降维的线性映射:
\]
其中数据集 \( \mathbf{X} = ( \mathbf{x} _ {1},...,\mathbf{x} _ {m} ) \),矩阵 \( \mathbf{M} = ( \mathbf{I} - \mathbf{W} ) ^{T} ( \mathbf{I} - \mathbf{W} ) \),矩阵 \( \mathbf{I} = diag(1,...,1) \)。
按特征值从小到大的次序( \( \lambda _ {0} \leq ...\leq \lambda _ {d-1} \) )将求解到的特征向量进行排列 \( \mathbf{a} _ {0},..., \mathbf{a} _ {d-1} \),这样降维后的嵌入坐标则为:
\]
其中
\]
NPE算法推导
NPE 算法主要是先提取流形的局部线性信息,然后通过保留这种信息来实现降维。具体来说,NPE 首先用局部的线性重构来表示流形局部的线性结构,其形式为均方差。设定样本数为 m ,维数为 n,降维后维数为 d,\(\mathbf{Q} (i)\) 为样本 i 的 k 个近邻样本集合,则在高维空间中表征重构误差的目标函数为:
\]
由优化目标函数得来的矩阵 \(\mathbf{W}\) 便包含了流形的局部信息。在降维的过程中,NPE 在参数空间(降维后的低维空间)中以保留和高维原始空间相同的局部线性重构为目标(即在目标函数中使用相同的权重矩阵 \(\mathbf{W}\) ),来实现线性降维,其低维空间的目标函数为:
\]
NPE 的算法推导主要分为两步,一是计算权重矩阵,二是计算映射和低维嵌入。具体推导如下:
首先将第一个目标函数表示为矩阵形式:
\]
\]
\]
\]
\]
其中 \(\mathbf{W} _ {i}\) 是有样本 i 的 k 个近邻点对应的权重系数组成的列向量,矩阵 \(\mathbf{Z} _ {i} = ( \mathbf{x} _ {i} - \mathbf{x} _ {j} )( \mathbf{x} _ {i} - \mathbf{x} _ {j} ) ^{T} ,j\in \mathbf{Q}(i)\)。
考虑到归一化约束,我们再将其约束等式化为矩阵形式:
\]
其中 \(\mathbf{1} _{k}\) 为 k 维全 1 向量。
利用拉格朗日乘子法将矩阵形式得目标函数和约束等式合并为一个目标:
\]
对 \(\mathbf{W}\) 求导并令其值为 0,则:
\]
利用归一化约束,对结果进行归一化,则最终权重矩阵 \(\mathbf{W} _{i}\) 为:
\]
\]
得到权重矩阵后,我们就可以来计算降维的映射了。首先定义:
\]
再将上式转换为矩阵形式:
\]
则第二个目标函数可简化为:
\]
\]
\]
\]
由于 NPE 算法是线性降维方法,所以降维后的嵌入可表示为:
\]
这里 \(\mathbf{y}\) 只是 m 个样本降到一维的嵌入坐标,\(\mathbf{a}\)是其对应的映射。
那么第二个目标函数可进一步表示为:
\]
\]
并且参数空间的嵌入坐标也有约束:
\]
同第一个目标函数的求解,这里利用拉格朗日乘子法将第二个目标函数和约束条件合并,并对其求导,可得下列的广义特征向量问题:
\]
其中 \(\mathbf{M}\) 可由求得的权重矩阵 \(\mathbf{W}\) 得出,那么上述的广义特征向量便可以求解。最后解得的特征向量,按次序排列便是映射矩阵了。
代码实现
这里分别给出 python 和 matlab 的代码实现。
python
首先创建一个典型的“瑞士卷”数据集:
import numpy
def swissroll(N=1000):
tt = numpy.array((5*numpy.pi/4)*(1+2*numpy.random.rand(N)))
height = numpy.array((numpy.random.rand(N)-0.5))
noise = 0.0
X = numpy.array([(tt+noise*numpy.random.randn(N))*numpy.cos(tt), 10*height, (tt+noise*numpy.random.randn(N))*numpy.sin(tt)])
return X
接着,再利用 shogun 库来进行 NPE 算法的实现:
import modshogun as sg
# load data
feature_matrix = swissroll()
# create features instance
features = sg.RealFeatures(feature_matrix)
# create Neighborhood Preserving Embedding converter instance
converter = sg.NeighborhoodPreservingEmbedding()
# set target dimensionality
converter.set_target_dim(2)
# set number of neighbors
converter.set_k(10)
# set number of threads
converter.parallel.set_num_threads(2)
# set nullspace shift (optional)
converter.set_nullspace_shift(-1e-6)
# compute embedding with Neighborhood Preserving Projections method
embedding = converter.embed(features)
matlab
至于 matlab 代码在何晓飞教授的主页上有,由于篇幅过长,这里就不贴出来了。
邻域保持嵌入(NPE)的更多相关文章
- 局部线性嵌入(LLE)原理总结
局部线性嵌入(Locally Linear Embedding,以下简称LLE)也是非常重要的降维方法.和传统的PCA,LDA等关注样本方差的降维方法相比,LLE关注于降维时保持样本局部的线性特征,由 ...
- 知识图谱顶会论文(SIGIR-2022) MorsE:归纳知识图嵌入的元知识迁移
MorsE:归纳知识图嵌入的元知识迁移 论文题目: Meta-Knowledge Transfer for Inductive Knowledge Graph Embedding 论文地址: http ...
- Fis3的前端工程化之路[三大特性篇之内容嵌入]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- 页面嵌入dom与被嵌入iframe的攻防
1.情景一:自己的页面被引入(嵌入)至别人的页面iframe中 if(window.self != window.top){ //url是自己页面的url window.top.location.hr ...
- ABP文档 - 嵌入的资源文件
文档目录 本节内容: 简介 创建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 简介 一个web应用里,客户端包含javascript,css,xml等文件,这此文件被添加到一个web项目后,发布成独立的 ...
- 【Win 10应用开发】把文件嵌入到XML文档
把文件内容嵌入(或存入)到XML文档中,相信很多朋友会想到把字节数组转化为Base64字符串,再作为XML文档的节点.不过,有人会说了,转化后的base64字符串中含有像“+”这样的符号,写入到XML ...
- 网站实现微信登录之嵌入二维码——基于yii2开发的描述
之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...
- 移动端嵌入pdf.js远程请求pdf出现(206)
最近在做移动端的开发,需要嵌入pdf进行预览.看了很多的js组件后选择了pdf.js:使用起来还是比较方便的,至于使用网上有很多的教程. 但在使用过程中出现了如下一个问题(我做的是IOS系统): 问题 ...
- h5嵌入视频遇到的bug及总结
最近做的一个h5活动因为嵌入视频而发现了好多以前从未发现的问题,在测试的时候不同系统不同版本不同环境等多多少少都出现了些问题,搞得我也是焦头烂额的,不过好在最终问题都解决了,自己也学到了好多东西,为了 ...
随机推荐
- HDU 6053:TrickGCD(莫比乌斯反演)
题目链接 题意 给出n个数,问在这n个数里面,有多少组bi(1<=bi<=ai)可以使得任意两个bi不互质. 思路 想法就是枚举2~min(ai),然后去对于每个ai都去除以这些质数,然后 ...
- SPOJ:NPC2016A(数学)
http://www.spoj.com/problems/NPC2016A/en/ 题意:在一个n*n的平面里面,初始在(x,y)需要碰到每条边一次,然后返回(x,y),问最短路径是多长. 思路:像样 ...
- java打印1000内的质数并用表格输出
<table width='500' border='1'><% int c=1; for(int i=2;i<=1000;i++){ int n=0; for(int j=2 ...
- 音频算法speex中的aec分析以及解析
算法原理: Speex的AEC是以NLMS(Normalized Least Mean Square)为基础,用MDF(multidelay block frequency domain)频域实现,最 ...
- C# 获取计算机相关信息
整理了一个关于计算机相关系统的资料 需要引入命名空间: 1. 在'解决方案资源管理器' 窗口中->右击项目-> '添加' -> '引用' 弹出引用管理器 2. 在引用处理器中,程序集 ...
- Linux命令学习-tail命令
Linux中,tail命令的全称就是tail,主要用于监控日志文件. 对于一个正在运行应用来说,其对应的log日志文件肯定是在不断的更新,此时,便可通过tail命令来动态显示日志文件的内容.假设当前目 ...
- C语言学习书籍推荐《C语言程序设计 现代方法(第2版)》下载
下载地址:点我 C语言仍然是计算机领域的通用语言之一,但现在的C语言已经和当初的时候大不相同了.本书主要的一个目的就是通过一种“现代方法”来介绍C语言,书中强调标准C,强调软件工程,不再强调“手工优化 ...
- Contiki源码分析--CPU为cc253x里的uart0.c
我所使用的Contiki系统是contiki-sensinode.理解该文需要有cc2530里uart的相关知识,具体寄存器的用法不做介绍. 先放上所有代码,然后再仔细分析. #include < ...
- SpringBoot工程热部署
SpringBoot工程热部署 1.在pom文件中添加热部署依赖 <!-- 热部署配置 --> <dependency> <groupId>org.springfr ...
- 个人永久性免费-Excel催化剂功能第69波-打造最专业易用的商务图表库,即点即用的高级Excel图表
Excel很大一块细分领域是图表,数据分析的末端,数据展示环节,精美恰当的图表,能够为数据分析数据结论带来画龙点睛的一笔.Excel催化剂简单内置了图表库,利用已经做好的模板式的图表示例,可快速复制使 ...