流形学习之等距特征映射(Isomap)
感觉是有很久没有回到博客园,发现自己辛苦写的博客都被别人不加转载的复制粘贴过去真的心塞,不过乐观如我,说明做了一点点东西,不至于太蠢,能帮人最好。回校做毕设,专心研究多流形学习方法,生出了考研的决心。话不多说,看论文带大家走入Joshua B. Tenenbaum的Isomap的世界!
大数据时代的人总是那么的浮躁不安,高维并不可怕,事实的本质总是简单而单调的,因此流形学习理念中直接假设高维的数据都存在低维的本征结构。自“流形”这个概念被提出以来,许多人都在寻找一个高维数据中最现实的问题——降维(维数简约)。为在高维观察值中寻找有意义的低维,Tenenbaum提出“非线性降维的全局几何框架”计算出了全局最优解,并保证近似收敛到原始高维数据的真实结构。我这里不想翻译人家的东西,仅仅是将该算法接着前面说的研究生的数模题给出的数据来讲解,也是对作者本人的尊重(可以学习,但拒绝粘贴!)。
题目:3c.mat中的数据为两个人在不同光照下的人脸图像共20幅(X变量的每一列为拉成向量的一副人脸图像),请将这20幅头像分为两类。
思考1:不管如何,首先加载数据(load 3c.mat)看看这个3c.mat文件中到底是个神马数据

我们知道,这个数据的20个人脸(来源于两个人在不同光照下的照片),其中每一个人脸数据是经过拉长后的2016维的人脸头像数据,这样每一张图片就是一个2016维欧式空间的一个点。按照流形的定义,可以认为这两个人脸头像经过不同光照内嵌在2016维的高维空间中。因此需要降维到三维流形,三维流形中的三个变量分别是:人脸1、人脸2与不同的光照。
思考2:说道维数约简(降维技术哪家强),经典的降维技术就是主成分分析(PAC)和多维尺度分析(MDS)简单易行,并且能保证发现高维输入空间的位于线性子空间上的真实数据结构。其中PCA以方差的大小来衡量信息量的多少,认为方差正比的反应提供的信息量,其基本思想是通过线性变换尽可能地保留方差大的数据量。而MDS基本思想是在低维嵌入空间中尽量保持原始数据任意两点之间的欧式距离。但是,对于包含非线性结构的数据集而言,这两种方法往往是无效的,尤其是本题中的人脸数据集的内嵌的三个维度使用以上方法是徒劳的(无法线性表示,也无法使用欧式距离衡量点与点之间的距离)。这就轮到咱们流形学说的人出场啦~
思考3:其实线性流形方法无法在非线性流形上解决的问题,无非是需要解决两个问题:
1、如何测量流形上的几何距离?
2、如何将高维的2016维欧式空间映射到三维的低维空间?
首先,针对问题1,将MDS算法中的欧式距离换成“测地距离”,先抛一个“测地线的维基定义”。预热以后,我们来看经典的瑞士卷(图A),注意以下图A、B、C均来源于原文论文Fig3截图:

看到瑞士卷,我饿了》《,现在要我们把自己想象成是瑞士卷上的蚂蚁(对人类来说瑞士卷是三维的,对蚂蚁来说是二维的),上图A中的两个黑色圈圈为两只恩爱无比的蚂蚁,如何让这两只蚂蚁在最短的时间内见面呢?要走最短路径测地线蓝色线才是正道(直线最短?直接沿着虚线强行阔过去?你不想活了么?)因此,抛弃欧式距离,引来测地距离~
邻近点:直接计算邻近点之间的欧式空间距离
远距离的点:计算邻近点之间的最短距离连接成的序列,如下图所示(来源于博客),要计算空间中远距离的亮点1与9,计算1到9的最短路径1、2、3...9,沿着路径依次类推直到到达目的地9(根据流形中的全局非线性和局部线性属性):

最后形成如下图所示的瑞士卷上的逼近测地线,如下图B中的红色线条所示:

实现方法:引入图论框架,将数据作为图中的点,点与其邻近点之间使用边来连接,逼近的测地线使用最短路径代替。
Isomap算法如下:
步骤1:构建邻接图G(复杂度:O(DN2))
基于输入空间X中流形G上的的邻近点对i,j之间的欧式距离dx (i,j),选取每个样本点距离最近的K个点(K-Isomap)或在样本点选定半径为常数ε的圆内所有点为该样本点的近邻点,将这些邻近点用边连接,将流形G构建为一个反映邻近关系的带权流通图G;
步骤2:计算所有点对之间的最短路径(复杂度:O(DN2))
通过计算邻接图G上任意两点之间的最短路径逼近流形上的测地距离矩阵DG={dG(i,j)},最短路径的实现以Floyd或者Dijkstra算法为主。
步骤3:构建k维坐标向量(复杂度:O(dN2))
根据图距离矩阵DG={dG(i,j)}使用经典Mds算法在d维空间Y中构造数据的嵌入坐标表示(如下图C所示),选择低维空间Y的任意两个嵌入坐标向量yi与yj使得代价函数最小:

其中等式1.1的全局最优解可以通过将坐标向量yi设置为距离矩阵DG前d个特征值对应的特征向量来得到。

以上算法的实现可以通过主页:http://isomap.stanford.edu/访问获得,数模问题中的人像聚类的实现则是通过这一流形学习延伸出来的聚类算法K-manifolds实现,SSC算法的实现也可以给予参考,代码如下:
%% 图c, ssc方法
load('3c.mat')
r = 0; affine = true; outlier = false; rho = 0.7; alpha=20;
[IDX, C1] = SSC(data,r,affine,alpha,outlier,rho,2);
for i=1:20
subplot(4,5,i);
pic = data(:,i);
pic = reshape(pic,[42,48]);
imshow(pic/256);
if (IDX(i)==1)
title('');
else
title('');
end
end
结果如下图所示:

很明显,第四行的第四张图识别错误,待老衲吧k-manifolds的代码调试后对比一下效果,最后感谢谷歌搜索带来的以下资料:
http://www-clmc.usc.edu/publications/T/tenenbaum-Science2000.pdf
以及王勇博士的博士论文《基于流形学习的分类与聚类方法及其应用研究》
流形学习之等距特征映射(Isomap)的更多相关文章
- 流形学习(manifold learning)综述
原文地址:https://blog.csdn.net/dllian/article/details/7472916 假设数据是均匀采样于一个高维欧氏空间中的低维流形,流形学习就是从高维采样数据中恢复低 ...
- 流形学习 (Manifold Learning)
流形学习 (manifold learning) zz from prfans............................... dodo:流形学习 (manifold learning) ...
- ML:流形学习
很多原理性的东西需要有基础性的理解,还是篇幅过少,所以讲解的不是特别的清晰. 原文链接:http://blog.sciencenet.cn/blog-722391-583413.html 流形(man ...
- 机器学习算法总结(十二)——流形学习(Manifold Learning)
1.什么是流形 流形学习的观点:认为我们所能观察到的数据实际上是由一个低维流行映射到高维空间的.由于数据内部特征的限制,一些高维中的数据会产生维度上的冗余,实际上这些数据只要比较低的维度就能唯一的表示 ...
- Manifold learning 流形学习
Machine Learning 虽然名字里带了 Learning 一个词,让人乍一看觉得和 Intelligence 相比不过是换了个说法而已,然而事实上这里的 Learning 的意义要朴素得多. ...
- 用t-SNE进行流形学习(digits数据集)
流行学习算法: 是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化. t-SNE算法是其中一种. PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方 ...
- Python数据科学手册-机器学习: 流形学习
PCA对非线性的数据集处理效果不太好. 另一种方法 流形学习 manifold learning 是一种无监督评估器,试图将一个低维度流形嵌入到一个高纬度 空间来描述数据集 . 类似 一张纸 (二维) ...
- 自组织特征映射神经网络(SOFM)
1981年芬兰 Helsink 大学的 T·Kohonen 教授提出一种自组织特征映射网 (Self-Organizing Feature Map , SOFM ), 又称 Kohonen 网 . K ...
- 拉普拉斯特征映射(Laplacian Eigenmaps)
1 介绍 拉普拉斯特征映射(Laplacian Eigenmaps)是一种不太常见的降维算法,它看问题的角度和常见的降维算法不太相同,是从局部的角度去构建数据之间的关系.也许这样讲有些抽象,具体来讲, ...
随机推荐
- windows server 开机自动登录并锁定
这个操作对于广大使用Windows(包括xp/win7/2003/2008 R2 等windows 系统) 的上班族会有点用. 其一:如果是个人吧系统(win7.xp)上班时候打开电脑,自动登录,系统 ...
- linux 学习随笔-磁盘管理
1:df 用于查看已挂载磁盘的容量信息 -i 查看inodes使用情况 -h 以合适的单位显示 -k -m 分别以k M单位显示 2:du 查看某个文件或者目录占用的空间 du [-abckmsh] ...
- 在Eclipse上使用Maven
Maven安装 去官网下载Maven,如下链接: http://maven.apache.org/download.cgi# 选择下载Binary zip archive 解压到本地,安装Maven前 ...
- js技术发展
将.NET代码编译为JavaScript 你可以使用如下工具将C#.F#以及其他.NET代码编译为JavaScript代码. Apps in Motion:允许使用C#来构建可以运行在任何设备上的We ...
- 《Hey程序员 你适合加入创业公司吗?》再补充
笔者经过多年的走访发现,不是所有优秀的程序员都能在创业公司如鱼得水.根据笔者的经验,具备下面几点优秀品质的程序员会更容易适应创业公司的环境. 1.娴熟的调试技巧可以说,程序员的大部分时间都花在调试程序 ...
- SQLServer中给表增加组合唯一约束
将两个或者多个字段一起约束成一个唯一约束 alter table 表名 add constraint 约束名 unique (列名1,列名2)
- jquery中attr和prop的区别、 什么时候用 attr 什么时候用 prop (转自 芈老头 )
jquery中attr和prop的区别. 什么时候用 attr 什么时候用 prop 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别?这 ...
- Java 使用 JRegistry-1.8.1 读取和设置 windows 注册表
在一个监控相关的Java项目中,需要读取windows系统的注册表,搜索到使用 JRegistery 可以解决.代码如下: /** * @author digdeep@126.com */ publi ...
- 如何在开机时让Tomcat以进程的方式启动
一. 安装tomcat服务 1. 打开cmd命令窗口,进入到"tomcat安装路径/bin"目录下,运行"service.bat install"命令,安装to ...
- android AsyncTask实例
.java package com.example.activitydemoay; import android.app.Activity; import android.content.Intent ...