传统的线性降维方法,如主成分分析(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}\) 的元素值主要通过最小化如下目标函数得到:

\[\min \sum _{i} \left| \left| \mathbf{x} _{i} - \sum _{j} W _{ij} \mathbf{x} _{j} \right| \right| ^{2},
\]

其中 \(\mathbf{W}\) 应满足归一化约束:

\[\sum _{j} W _{ij} = 1,j=1,2,...,m.
\]

3. 计算映射

通过求解广义特征向量问题来计算降维的线性映射:

\[\mathbf{XMX} ^{T} \mathbf{a}=\lambda \mathbf{XX} ^{T} \mathbf{a},
\]

其中数据集 \( \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} \),这样降维后的嵌入坐标则为:

\[\mathbf{y} _ {i} = \mathbf{A} ^{T} \mathbf{x} _ {i},
\]

其中

\[\mathbf{A} = ( \mathbf{a} _{0}, \mathbf{a} _{1},...,\mathbf{a} _{d-1} ).
\]

NPE算法推导

NPE 算法主要是先提取流形的局部线性信息,然后通过保留这种信息来实现降维。具体来说,NPE 首先用局部的线性重构来表示流形局部的线性结构,其形式为均方差。设定样本数为 m ,维数为 n,降维后维数为 d,\(\mathbf{Q} (i)\) 为样本 i 的 k 个近邻样本集合,则在高维空间中表征重构误差的目标函数为:

\[\phi ( \mathbf{W} ) = \sum ^{m} _{i=1} \left| \left| \mathbf{x} _{i} - \sum _{j\in \mathbf{Q}(i)} W _{ij} \mathbf{x} _{j} \right| \right| ^{2},
\]

由优化目标函数得来的矩阵 \(\mathbf{W}\) 便包含了流形的局部信息。在降维的过程中,NPE 在参数空间(降维后的低维空间)中以保留和高维原始空间相同的局部线性重构为目标(即在目标函数中使用相同的权重矩阵 \(\mathbf{W}\) ),来实现线性降维,其低维空间的目标函数为:

\[\Phi ( \mathbf{y} ) = \sum ^{m} _{i=1} \left| \left| y _{i} - \sum ^{m} _{j=1} W _{ij} y _{j} \right| \right| ^{2}.
\]

NPE 的算法推导主要分为两步,一是计算权重矩阵,二是计算映射和低维嵌入。具体推导如下:

首先将第一个目标函数表示为矩阵形式:

\[\phi ( \mathbf{W} ) = \sum ^{m} _{i=1} \left| \left| \mathbf{x} _{i} - \sum _{j\in \mathbf{Q}(i)} W _{ij} \mathbf{x} _{j} \right| \right| ^{2}
\]

\[= \sum ^{m} _{i=1} \left| \left| \sum _{j\in \mathbf{Q}(i)} W _{ij} \mathbf{x} _{i} - \sum _{j\in \mathbf{Q}(i)} W _{ij} \mathbf{x} _{j} \right| \right| ^{2}
\]

\[= \sum ^{m} _{i=1} \left| \left| \sum _{j\in \mathbf{Q}(i)} W _{ij} ( \mathbf{x} _{i} - \mathbf{x} _{j} ) \right| \right| ^{2}
\]

\[= \mathbf{W} ^{T} _{i} ( \mathbf{x} _{i} - \mathbf{x} _{j} )( \mathbf{x} _{i} - \mathbf{x} _{j} ) ^{T} \mathbf{W} _{i}
\]

\[= \sum ^{m} _{i=1} \mathbf{W} ^{T} _{i} \mathbf{Z} _{i} \mathbf{W} _{i}
\]

其中 \(\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)\)。

考虑到归一化约束,我们再将其约束等式化为矩阵形式:

\[\sum _{j\in \mathbf{Q}(i)} W _{ij} = \mathbf{W} ^{T} _{i} \mathbf{1} _{k} =1,
\]

其中 \(\mathbf{1} _{k}\) 为 k 维全 1 向量。

利用拉格朗日乘子法将矩阵形式得目标函数和约束等式合并为一个目标:

\[\mathbf{L} (\mathbf{W}) = \sum ^{m} _{i=1} \mathbf{W} ^{T} _{i} \mathbf{Z} _{i} \mathbf{W} _{i} + \lambda'(\mathbf{W} ^{T} _{i} \mathbf{1} _{k} - 1).
\]

对 \(\mathbf{W}\) 求导并令其值为 0,则:

\[\mathbf{W} _{i} = -\dfrac{1}{2} \lambda \mathbf{Z} ^{-1} _{i} \mathbf{1} _{k}.
\]

利用归一化约束,对结果进行归一化,则最终权重矩阵 \(\mathbf{W} _{i}\) 为:

\[\mathbf{W} _{i} = \dfrac{-\dfrac{1}{2} \lambda \mathbf{Z} ^{-1} _{i} \mathbf{1} _{k}}{\mathbf{W} ^{T} _{i} \mathbf{1} _{k}}
\]

\[= \dfrac{\mathbf{Z} ^{-1} _{i} \mathbf{1} _{k}}{\mathbf{1} ^{T} _{k} (\mathbf{Z} ^{-1} _{i}) ^{T} \mathbf{1} _{k}}.
\]

得到权重矩阵后,我们就可以来计算降维的映射了。首先定义:

\[z _{i} = y _{i} - \sum ^{m} _{j=1} W _{ij} y _{j},
\]

再将上式转换为矩阵形式:

\[\mathbf{z} = \mathbf{y} - \mathbf{Wy} = (\mathbf{I} - \mathbf{W}) \mathbf{y}.
\]

则第二个目标函数可简化为:

\[\Phi(\mathbf{y}) = \sum ^{m} _{i=1} \left( y _{i} - \sum ^{m} _{j=1} W _{ij} y _{j} \right) ^{2}
\]

\[= \sum ^{m} _{i=1} (z _{i}) ^{2}
\]

\[= \mathbf{z} ^{T} \mathbf{z}
\]

\[= \mathbf{y} ^{T} (\mathbf{I} - \mathbf{W}) ^{T} (\mathbf{I} - \mathbf{W}) \mathbf{y}.
\]

由于 NPE 算法是线性降维方法,所以降维后的嵌入可表示为:

\[\mathbf{y} ^{T} = \mathbf{a} ^{T} \mathbf{X},
\]

这里 \(\mathbf{y}\) 只是 m 个样本降到一维的嵌入坐标,\(\mathbf{a}\)是其对应的映射。

那么第二个目标函数可进一步表示为:

\[\Phi(\mathbf{y}) = \mathbf{a} ^{T} \mathbf{X} (\mathbf{I} - \mathbf{W}) ^{T} (\mathbf{I} - \mathbf{W}) \mathbf{X} ^{T} \mathbf{a}
\]

\[= \mathbf{a} ^{T} \mathbf{X} \mathbf{M} \mathbf{X} ^{T} \mathbf{a}.
\]

并且参数空间的嵌入坐标也有约束:

\[\mathbf{y} ^{T} \mathbf{y} = 1 \implies \mathbf{a} ^{T} \mathbf{X} \mathbf{X} ^{T} \mathbf{a}.
\]

同第一个目标函数的求解,这里利用拉格朗日乘子法将第二个目标函数和约束条件合并,并对其求导,可得下列的广义特征向量问题:

\[\mathbf{XMX} ^{T} \mathbf{a}=\lambda \mathbf{XX} ^{T} \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)的更多相关文章

  1. 局部线性嵌入(LLE)原理总结

    局部线性嵌入(Locally Linear Embedding,以下简称LLE)也是非常重要的降维方法.和传统的PCA,LDA等关注样本方差的降维方法相比,LLE关注于降维时保持样本局部的线性特征,由 ...

  2. 知识图谱顶会论文(SIGIR-2022) MorsE:归纳知识图嵌入的元知识迁移

    MorsE:归纳知识图嵌入的元知识迁移 论文题目: Meta-Knowledge Transfer for Inductive Knowledge Graph Embedding 论文地址: http ...

  3. Fis3的前端工程化之路[三大特性篇之内容嵌入]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  4. 页面嵌入dom与被嵌入iframe的攻防

    1.情景一:自己的页面被引入(嵌入)至别人的页面iframe中 if(window.self != window.top){ //url是自己页面的url window.top.location.hr ...

  5. ABP文档 - 嵌入的资源文件

    文档目录 本节内容: 简介 创建嵌入的文件 暴露嵌入的文件 使用嵌入的文件 简介 一个web应用里,客户端包含javascript,css,xml等文件,这此文件被添加到一个web项目后,发布成独立的 ...

  6. 【Win 10应用开发】把文件嵌入到XML文档

    把文件内容嵌入(或存入)到XML文档中,相信很多朋友会想到把字节数组转化为Base64字符串,再作为XML文档的节点.不过,有人会说了,转化后的base64字符串中含有像“+”这样的符号,写入到XML ...

  7. 网站实现微信登录之嵌入二维码——基于yii2开发的描述

    之前写了一篇yii2获取登录前的页面url地址的文章,然后发现自己对于网站实现微信扫码登录功能的实现不是很熟悉,所以,我会写2-3篇的文章来描述下一个站点如何实现微信扫码登录的功能,来复习下微信扫码登 ...

  8. 移动端嵌入pdf.js远程请求pdf出现(206)

    最近在做移动端的开发,需要嵌入pdf进行预览.看了很多的js组件后选择了pdf.js:使用起来还是比较方便的,至于使用网上有很多的教程. 但在使用过程中出现了如下一个问题(我做的是IOS系统): 问题 ...

  9. h5嵌入视频遇到的bug及总结

    最近做的一个h5活动因为嵌入视频而发现了好多以前从未发现的问题,在测试的时候不同系统不同版本不同环境等多多少少都出现了些问题,搞得我也是焦头烂额的,不过好在最终问题都解决了,自己也学到了好多东西,为了 ...

随机推荐

  1. 驰骋工作流引擎ccflow-ccbpm工作流引擎sdk表单装载逻辑处理注意事项

    cbpm工作流引擎sdk表单装载逻辑处理注意事项 关键字:驰骋工作流引擎 sdk表单 装载接口调用   说明:如果您要采用ccbpm的sdk表单开发,在表单 加载前您需要调用一个接口来获得当前节点的信 ...

  2. Android native进程间通信实例-socket本地通信篇之——基本通信功能

    导读: 网上看了很多篇有关socket本地通信的示例,很多都是调通服务端和客户端通信功能后就没有下文了,不太实用,真正开发中遇到的问题以及程序稳定性部分没有涉及,代码健壮性不够,本系列(socket本 ...

  3. Java 垃圾收集总结

    概述 垃圾收集(Garbage Collection,GC),它不是Java语言的伴生产物,它的历史比Java还要久远. 人们主要思考GC需要完成的3件事情: 哪些内存需要回收? 什么时候回收? 如何 ...

  4. linux_硬链接和软链接区别

    硬链接有点类似于复制的概念.    ln 源文件 目的文件    ln不加-s,则默认是硬链接.例如,ln script script-hard,ls命令显示,script*显示硬链接有两个.我任意删 ...

  5. Cookie起源与发展

    上一篇我们在讲优酷弹幕爬虫的时候,引入了一个新的知识点:Cookie,由于篇幅有限当时只是简单的给大家介绍了一下它的作用,今天我们就来全面了解一下Cookie(小饼干)以及相关的知识! 相信很多同学肯 ...

  6. LaTeX大全

    1.指数和下标可以用^和_后加相应字符来实现.比如: 2.平方根(square root)的输入命令为:\sqrt,n 次方根相应地为: \sqrt[n].方根符号的大小由LATEX自动加以调整.也可 ...

  7. UVA10763 交换学生 Foreign Exchange 题解

    题目链接: https://www.luogu.org/problemnew/show/UVA10763 题目分析: 本题我首先想到的做法是把每一个数都map一下,然后互相判断,例如a,b两人准备交换 ...

  8. C#中的Contains与IndexOf的区别

     C#中要判断一个字符串是否包含另一个字符串,常用的两种方法是 str.Contains和str.IndexOf 这两个方法的区别是: Contains是找指定字符串是否包含一个字串,返回值的bo ...

  9. 小白学python-day05-IDE、格式化输出、For While循环、断点、continue、break

    今天是day05,以下是学习总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...

  10. java并发笔记之java线程模型

    警告⚠️:本文耗时很长,先做好心理准备 java当中的线程和操作系统的线程是什么关系? 猜想: java thread —-对应-—> OS thread Linux关于操作系统的线程控制源码: ...