邻域保持嵌入(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活动因为嵌入视频而发现了好多以前从未发现的问题,在测试的时候不同系统不同版本不同环境等多多少少都出现了些问题,搞得我也是焦头烂额的,不过好在最终问题都解决了,自己也学到了好多东西,为了 ...
随机推荐
- BZOJ 2460:元素(贪心+线性基)
题目链接 题意 中文题意 思路 线性基学习 题目要求选价值最大的并且这些数异或后不为0,可以考虑线性基的性质:线性基的任意一个非空集合XOR之和不会为0.那么就可以贪心地对价值从大到小排序,加入线性基 ...
- 对比 C++ 和 Python,谈谈指针与引用
花下猫语:本文是学习群内 樱雨楼 小姐姐的投稿.之前已发布过她的一篇作品<当谈论迭代器时,我谈些什么?>,大受好评.本文依然是对比 C++ 与 Python,来探讨编程语言中极其重要的概念 ...
- SpringMvc整合hibernate
之前用的比较多的是Mybatis,最近应客户要求准备hibernate的技术,给我最深的感触就是,能用mybatis尽量用mybatis,和hibernate相比优秀了不是一点半点,hibernate ...
- Spring Boot2(十一):Mybatis使用总结(自增长、多条件、批量操作、多表查询等等)
一.前言 上次用Mybatis还是2017年做项目的时候,已经很久过去了.中途再没有用过Mybatis.导致现在学习SpringBoot过程中遇到一些Mybatis的问题,以此做出总结(XML极简模式 ...
- solidity智能合约如何判断地址为0或空
智能合约地址判断 在旧版本中可使用以下代码来进行比较: owner != 0x0 但如果在新版本中使用,则会提示错误信息. 那么,如何正确使用来比较地址是否为空呢. 解决方案 可以使用address( ...
- Bzoj 1040 [ZJOI2008]骑士 题解
1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5368 Solved: 2044[Submit][Status ...
- 注入攻击-XSS攻击-CSRF攻击
1.注入攻击 注入攻击包括系统命令注入,SQL注入,NoSQL注入,ORM注入等 1.1攻击原理 在编写SQL语句时,如果直接将用户传入的数据作为参数使用字符串拼接的方式插入到SQL查询中,那么攻击者 ...
- Pascal到c++,求大佬翻译!
请大佬翻译完毕后私信我谢谢! var a,b,c,d,f:array[1..1000]of longint; i,j,k,n,m,o:longint; procedure zx(p,q:longint ...
- Java:前程似锦的 NIO 2.0
Java 之所以能够霸占编程语言的榜首,其强大.丰富的类库功不可没,几乎所有的编程问题都能在其中找到解决方案.但在早期的版本当中,输入输出(I/O)流并不那么令开发者感到愉快: 1)JDK 1.4 之 ...
- Java秒杀系统实战系列~构建SpringBoot多模块项目
摘要:本篇博文是“Java秒杀系统实战系列文章”的第二篇,主要分享介绍如何采用IDEA,基于SpringBoot+SpringMVC+Mybatis+分布式中间件构建一个多模块的项目,即“秒杀系统”! ...