1.流形学习的概念

流形学习方法(Manifold Learning),简称流形学习,自2000年在著名的科学杂志《Science》被首次提出以来,已成为信息科学领域的研究热点。在理论和应用上,流形学习方法都具有重要的研究意义。

假设数据是均匀采样于一个高维欧氏空间中的低维流形,流形学习就是从高维采样数据中恢复低维流形结构,即找到高维空间中的低维流形,并求出相应的嵌入映射,以实现维数约简或者数据可视化。它是从观测到的现象中去寻找事物的本质,找到产生数据的内在规律。

以上选自百度百科

简单地理解,流形学习方法可以用来对高维数据降维,如果将维度降到2维或3维,我们就能将原始数据可视化,从而对数据的分布有直观的了解,发现一些可能存在的规律。

2.流形学习的分类

可以将流形学习方法分为线性的和非线性的两种,线性的流形学习方法如我们熟知的主成份分析(PCA),非线性的流形学习方法如等距映射(Isomap)、拉普拉斯特征映射(Laplacian eigenmaps,LE)、局部线性嵌入(Locally-linear embedding,LLE)。

当然,流形学习方法不止这些,因学识尚浅,在此我就不展开了,对于它们的原理,也不是一篇文章就能说明白的。对各种流形学习方法的介绍,网上有一篇不错的读物(原作已找不到): 流形学习 (Manifold Learning)

3.高维数据降维与可视化

对于数据降维,有一张图片总结得很好(同样,我不知道原始出处):

图中基本上包括了大多数流形学习方法,不过这里面没有t-SNE,相比于其他算法,t-SNE算是比较新的一种方法,也是效果比较好的一种方法。t-SNE是深度学习大牛Hinton和lvdmaaten(他的弟子?)在2008年提出的,lvdmaaten对t-SNE有个主页介绍:tsne,包括论文以及各种编程语言的实现。

接下来是一个小实验,对MNIST数据集降维和可视化,采用了十多种算法,算法在sklearn里都已集成,画图工具采用matplotlib。大部分实验内容都是参考sklearn这里的example,稍微做了些修改。

Matlab用户可以使用lvdmaaten提供的工具箱: drtoolbox

- 加载数据

MNIST数据从sklearn集成的datasets模块获取,代码如下,为了后面观察起来更明显,我这里只选取n_class=5,也就是0~4这5种digits。每张图片的大小是8*8,展开后就是64维。

digits = datasets.load_digits(n_class=5)
X = digits.data
y = digits.target
print X.shape
n_img_per_row = 20
img = np.zeros((10 * n_img_per_row, 10 * n_img_per_row))
for i in range(n_img_per_row):ix = 10 * i + 1for j in range(n_img_per_row):iy = 10 * j + 1img[ix:ix + 8, iy:iy + 8] = X[i * n_img_per_row + j].reshape((8, 8))
plt.imshow(img, cmap=plt.cm.binary)
plt.title('A selection from the 64-dimensional digits dataset')

运行代码,获得X的大小是(901,64),也就是901个样本。下图显示了部分样本:


- 降维

以t-SNE为例子,代码如下,n_components设置为3,也就是将64维降到3维,init设置embedding的初始化方式,可选random或者pca,这里用pca,比起random init会更stable一些。

print("Computing t-SNE embedding")
tsne = manifold.TSNE(n_components=3, init='pca', random_state=0)
t0 = time()
X_tsne = tsne.fit_transform(X)
plot_embedding_2d(X_tsne[:,0:2],"t-SNE 2D")
plot_embedding_3d(X_tsne,"t-SNE 3D (time %.2fs)" %(time() - t0))

降维后得到X_ tsne,大小是(901,3),plot_ embedding_ 2d()将前2维数据可视化,plot_ embedding_ 3d()将3维数据可视化。

函数plot_ embedding_ 3d定义如下:

def plot_embedding_3d(X, title=None):#坐标缩放到[0,1]区间x_min, x_max = np.min(X,axis=0), np.max(X,axis=0)X = (X - x_min) / (x_max - x_min)#降维后的坐标为(X[i, 0], X[i, 1],X[i,2]),在该位置画出对应的digitsfig = plt.figure()ax = fig.add_subplot(1, 1, 1, projection='3d')for i in range(X.shape[0]):ax.text(X[i, 0], X[i, 1], X[i,2],str(digits.target[i]),color=plt.cm.Set1(y[i] / 10.),fontdict={'weight': 'bold', 'size': 9})if title is not None:plt.title(title)

- 看看效果

十多种算法,结果各有好坏,总体上t-SNE表现最优,但它的计算复杂度也是最高的。下面给出PCA、LDA、t-SNE的结果:





- 代码获取

MachineLearning/ManifoldLearning/DimensionalityReduction_DataVisualizing


转载请注明出处:http://blog.csdn.net/u012162613/article/details/45920827

流形学习-高维数据的降维与可视化相关推荐

  1. 高维数据特征降维技术学习

    原文地址:高维数据特征降维技术学习 作者:新技术笔记 特征降维(feature dimension reduction)是一个从初始高维特征集合中选出低维特征集合,以便根据一定的评估准则最优化缩小特征 ...

  2. 使用t-SNE算法对数据进行降维并可视化实战,与KernalPCA、LLE对比降维可视化的效果

    使用t-SNE算法对数据进行降维并可视化,与KernalPCA.LLE对比降维可视化的效果 MNIST 数据集已经是一个被"嚼烂"了的数据集, 很多教程都会对它"下手&q ...

  3. 高维数据PCA降维可视化(KNN分类)

    在做机器学习的时候,经常会遇到三个特征以上的数据,这类数据通常被称为高维数据.数据做好类别分类后,通过二维图或者三维图进行可视化,对于高维数据可以通过PCA(Principal Component A ...

  4. 流形学习的四种降维方法

    文章目录 流形学习 主成分分析(PCA) 原理 实现 手写版 调库版 缺点 奇异值分解(SVD) 原理 实现 线性判别分析(LDA) 原理 手写版 调库版 PCA与LDA 局部线性嵌入(LLE) 原理 ...

  5. 对高维数据进行降维的算法

    解析: 维度灾难:在高维情况下出现的数据样本稀疏,距离计算困难等问题. 缓解维度灾难的一个重要途径就是降维,通过某种数学变换将原始高维属性空间转变成一个低维子空间,在这个子空间中样本密度大幅提高,距离 ...

  6. 高维数据降维 国家自然科学基金项目 2009-2013 NSFC Dimensionality Reduction

    2013 基于数据降维和压缩感知的图像哈希理论与方法 唐振军 广西师范大学 多元时间序列数据挖掘中的特征表示和相似性度量方法研究 李海林 华侨大学       基于标签和多特征融合的图像语义空间学习技 ...

  7. python高维数据_t-SNE高维数据可视化(python)

    t-SNE实践--sklearn教程 t-SNE是一种集降维与可视化于一体的技术,它是基于SNE可视化的改进,解决了SNE在可视化后样本分布拥挤.边界不明显的特点,是目前最好的降维可视化手段. 关于t ...

  8. 文件可视化编辑_高维数据可视化必备图形平行坐标图

    作者:科研猫 | 小飞鼠 责编:科研猫 | 依米 如果我们想比较某个数值在不同分组之间的变化差异.或者随着时间序列的变化趋势,往往会用到折线图.折线图是在我们的科研绘图当中最为常用的图形之一. 正如在 ...

  9. t-sne 流形_流形学习[t-SNE,LLE,Isomap等]变得轻松

    t-sne 流形 Principal Component Analysis is a powerful method, but it often fails in that it assumes th ...

最新文章

  1. python 钉钉消息推送_python3实现钉钉消息推送的方法示例
  2. 使用nginx部署简单的前端项目,nginx.conf配置
  3. Windows Containers 大冒险: 加速
  4. ROS 机器人操作系统进阶实战
  5. live555 源码分析:RTSPServer 组件结构
  6. 单位矩阵的逆| 使用Python的线性代数
  7. 动画:什么是散列表?
  8. 20145120 《Java程序设计》实验一实验报告
  9. HashMap 的深入学习
  10. java 循环字符_在Java中从循环结果创建字符串
  11. 中国工业企业数据库(2015年)
  12. 二、三角高程测量计算(C#语言)
  13. JS原创小游戏 旋转方块(源码)
  14. android 新浪微博第三方登录,Android的集成新浪微博第三方登录
  15. 最新2022年高职大数据国赛任务书详解与模拟练习
  16. 等额本金和等额本息房贷公式推导
  17. 周转时间 平均周转时间 带权周转时间 平均带权周转时间
  18. Revit-常见问题汇总
  19. Ti IMGLIB库简介
  20. Rust中结构体的定义和实例化

热门文章

  1. C语言科学计数法E格式
  2. Servlet | Servlet原理、开发第一个带有Java小程序Servlet
  3. Visual Studio Code 运行命令行,无法加载文件 C:\**.ps1,因为在此系统上禁止运行脚本的解决方法
  4. 知道小编告诉你税务处理流程的方法
  5. C# Socket客户端编写
  6. Hough变换及MATLAB示例
  7. “博士坐下,硕士留下,本科等下,专科让下!”你敢不努力学习?
  8. Window XP驱动开发(二十一) 过滤驱动程序
  9. 【JavaScript】JS库:numbro
  10. PostgreSQL 数据库和 pgAdmin 4