感觉是有很久没有回到博客园,发现自己辛苦写的博客都被别人不加转载的复制粘贴过去真的心塞,不过乐观如我,说明做了一点点东西,不至于太蠢,能帮人最好。回校做毕设,专心研究多流形学习方法,生出了考研的决心。话不多说,看论文带大家走入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之间的欧式距离d(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

http://isomap.stanford.edu/

以及王勇博士的博士论文《基于流形学习的分类与聚类方法及其应用研究》

流形学习之等距特征映射(Isomap)的更多相关文章

  1. 流形学习(manifold learning)综述

    原文地址:https://blog.csdn.net/dllian/article/details/7472916 假设数据是均匀采样于一个高维欧氏空间中的低维流形,流形学习就是从高维采样数据中恢复低 ...

  2. 流形学习 (Manifold Learning)

    流形学习 (manifold learning) zz from prfans............................... dodo:流形学习 (manifold learning) ...

  3. ML:流形学习

    很多原理性的东西需要有基础性的理解,还是篇幅过少,所以讲解的不是特别的清晰. 原文链接:http://blog.sciencenet.cn/blog-722391-583413.html 流形(man ...

  4. 机器学习算法总结(十二)——流形学习(Manifold Learning)

    1.什么是流形 流形学习的观点:认为我们所能观察到的数据实际上是由一个低维流行映射到高维空间的.由于数据内部特征的限制,一些高维中的数据会产生维度上的冗余,实际上这些数据只要比较低的维度就能唯一的表示 ...

  5. Manifold learning 流形学习

    Machine Learning 虽然名字里带了 Learning 一个词,让人乍一看觉得和 Intelligence 相比不过是换了个说法而已,然而事实上这里的 Learning 的意义要朴素得多. ...

  6. 用t-SNE进行流形学习(digits数据集)

    流行学习算法: 是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化. t-SNE算法是其中一种. PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方 ...

  7. Python数据科学手册-机器学习: 流形学习

    PCA对非线性的数据集处理效果不太好. 另一种方法 流形学习 manifold learning 是一种无监督评估器,试图将一个低维度流形嵌入到一个高纬度 空间来描述数据集 . 类似 一张纸 (二维) ...

  8. 自组织特征映射神经网络(SOFM)

    1981年芬兰 Helsink 大学的 T·Kohonen 教授提出一种自组织特征映射网 (Self-Organizing Feature Map , SOFM ), 又称 Kohonen 网 . K ...

  9. 拉普拉斯特征映射(Laplacian Eigenmaps)

    1 介绍 拉普拉斯特征映射(Laplacian Eigenmaps)是一种不太常见的降维算法,它看问题的角度和常见的降维算法不太相同,是从局部的角度去构建数据之间的关系.也许这样讲有些抽象,具体来讲, ...

随机推荐

  1. ror 在windows下开发的坑

    虽然知道ror在windows下的坑很多很多,但是目前没有先将就入门学习,也不折腾了.后面等待新机器来了,用linux来搭平台,先记录一下遇到的坑. 1.views/layouts/applicati ...

  2. (ios) 屏幕触摸总结

    1  屏幕触控实现(单击 双击) [self becomeFirstResponder]; //允许多点互动 self.view.multipleTouchEnabled=TRUE; 实现事件部分 # ...

  3. Linux 虚拟机网络适配器从E1000改为VMXNET3

    我们知道VMware的网络适配器类型有多种,例如E1000.VMXNET.VMXNET 2 (Enhanced).VMXNET3等,就性能而言,一般VMXNET3要优于E1000,下面介绍如果将Lin ...

  4. SQL Server 2012 学习笔记5

    1. 索引(Index) 索引是快速的定位和查找数据.索引分为: 聚集索引:唯一,默认主键,一般选取比较连贯的字段,聚集索引是物理排序. 非聚集索引: 并没有把数据物理排序,只是多了一个索引页(包括索 ...

  5. x01.Excel: 合计件数

    由于 VBA 与 Excel 是耦合的,所以还是先看表: 件数的计算,用 Mod 即可.但考虑到要求码洋.数量等多种需求,就该 VBA 登场了.代码如下: '===================== ...

  6. 高仿一元云购IOS应用源码项目

    高仿一元云购IOS应用(高仿自一元云购安卓客户端) 本App因官方没有IOS客户端故开发,利用业务时间历时2个星期,终于开发完成,又因苹果的各大审核规则对此App的影响,又历时1个多月才终于成功上架, ...

  7. Android ViewPager再探:增加滑动指示条

    上一篇:<Android ViewPager初探:让页面滑动起来> ViewPager只是左右滑动有些丑,也不知道当前位于第几页面. 可以在上方加入滑动指示条,来确定当前位置. 只需要修改 ...

  8. 怎么找到占用usb的模块,linux下Jlink连接失败

    问题是这样产生的,我在linux下安装jlink,启动JLinkExe执行,总是提示不能通过usb连接: SEGGER J-Link Commander V5.10q (Compiled Mar :: ...

  9. 报表引擎API开发入门—简单程序数据集

    小编最近接的项目是有关报表开发的,很想把这部分知识分享出来.希望大家能够支持我!不多说,马上进入我们今天的话题. API基本知识 小编最近项目所做的是关于一个报表软件—FineReport报表开发的一 ...

  10. [转]SQL Server 高性能写入的一些总结

    本文转自:http://www.cnblogs.com/rush/archive/2012/08/31/2666090.html 1.1.1 摘要 在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起 ...