流形学习之等距特征映射(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)是一种不太常见的降维算法,它看问题的角度和常见的降维算法不太相同,是从局部的角度去构建数据之间的关系.也许这样讲有些抽象,具体来讲, ...
随机推荐
- #winhec# 开发人员刷屏看点 (视频)
今天大家已经被winhec刷屏了,本来不想写这篇了,但看了所有的文章,大家关注的都是windows 10的那些新功能,小米win10刷机,联想千元手机,小娜啥的.对于keynote上第二部分 Don ...
- 用java的jdk 生成android 的jni接口文档
1 检查系统是否安装了jdk,并将javac的路径配置到PATH中 cmd窗口,输入 java -version 查看输出项 2 创建需要so的接口类package com.ndk.test; p ...
- Aforge.net之旅——开篇:从识别验证码开始
时间过得真快啊,转眼今年就要过去了,大半年都没有写博客了,要说时间嘛,花在泡妹子和搞英语去了,哈哈...前几天老大问我 怎么这么长时间都没写博客了,好吧,继续坚持,继续分享我的心得体会. 这个系列我们 ...
- 已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7};把数组a与数组b ,对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2];最后输出数组b的元素。
int[]a={3,4,5,6,7}; int[]b={1,2,3,4,5,6,7}; int[] arry=new int[7]; System.out.print("数组b[]={&qu ...
- MySQL-procedure(cursor,loop)
现有一张表spam_keyword,共629条记录,每条记录的word字段的字符数量不等. CREATE TABLE `spam_keyword` ( `kid` ) NOT NULL, `word` ...
- head,tail
测试文件headtail 1 L 2 L 3 L 4 L 5 L 6 L 7 L 8 L 9 L 10 L 11 L 12 L 13 L 14 L 15 L 16 L 17 L 18 L 19 L h ...
- Linux下的压缩zip,解压缩unzip命令详解及实例
实例:压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip ====================== ...
- 地图编辑器V3
V3.2.4 (2014-07-03) ---------------------------1. 保存地图的锁定与可视状态:2. 地图单独存为map格式结尾的文件与导出的XML文件区别:3. 修正瓷 ...
- emacs 新手笔记(一) —— 阅读【emacs tutorial】
ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 [emacs tutorial]是熟悉 emacs 的入门资料.一共几十个命令,不需硬记,勤练即可. 翻页命 ...
- corefile 设置
程序运行的过程中,可能会因为一些隐藏的bug导致崩溃,为了在出问题时,及时记录所在环境的情况,所以要设置core文件的产生.其实其本质就是把进程的内存保存到文件中去. 1.core文件的生成开关和大小 ...