流形学习-高维数据的降维与可视化

原创 2015年05月22日 19:55:12

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 + 1
    for j in range(n_img_per_row):
        iy = 10 * j + 1
        img[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]),在该位置画出对应的digits
    fig = 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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012162613/article/details/45920827

高维数据的可视化 Visualizing data using t-SNE

Visualizing data using t-SNE, Laurens van der Maaten and Geoffrey
  • yihaizhiyan
  • yihaizhiyan
  • 2014-05-16 15:59:59
  • 20241

t-分布邻域嵌入算法(t-SNE algorithm)简单理解

这篇文章主要介绍一个有效的数据降维的方法 t-SNE.大数据时代,数据量不仅急剧膨胀,数据也变得越来越复杂,数据的维度也随之增加。比如大图片,数据维度指的是像素的数量级,范围从数千到数百万。计算机可以...
  • lzl1663515011
  • lzl1663515011
  • 2015-06-02 14:23:49
  • 25518

t-SNE初学

http://www.datakit.cn/blog/2015/08/06/t_SNE.html 本文主要参考wikipedia,介绍t-SNE算法,以及python下的一些实现可视化应用。...
  • jyl1999xxxx
  • jyl1999xxxx
  • 2016-11-12 11:43:05
  • 4846

理解 t-SNE (Python)

t-SNE(t-distribution Stochastic Neighbor Embedding)是目前最为流行的高维数据的降维算法。 t-SNE 成立的前提基于这样的一个假设:我们现实世界观察到...
  • lanchunhui
  • lanchunhui
  • 2016-10-25 23:45:45
  • 2688

详解可视化利器 t-SNE 算法:数无形时少直觉

本文介绍了 T 分布随机近邻嵌入算法,即一种十分强大的高维数据降维方法。我们将先简介该算法的基本概念与直观性理解,再从详细分析与实现该降维方法,最后我们会介绍使用该算法执行可视化的结果。 ...
  • Uwr44UOuQcNsUQb60zk2
  • Uwr44UOuQcNsUQb60zk2
  • 2017-11-15 06:39:05
  • 388

脑洞大开!高维数据怎样做出可视化效果的5个思路(多图)

高维指数据具有多个独立属性,多元指数据具有多个相关属性。怎样在视觉空间(三维空间/二维平面)上表达?...
  • shenmanli
  • shenmanli
  • 2017-03-30 10:24:20
  • 2870

t-SNE高维数据可视化(python)

t-SNE高维数据可视化(python) t-SNE(t-distributedstochastic neighbor embedding )是目前最为流行的一种高维数据降维的算法。在大数据的时代,数...
  • AUTO1993
  • AUTO1993
  • 2017-12-01 18:37:05
  • 1153

【数据可视化】复杂高维多元数据的可视化

1 高维多元数据          每个数据对象有两个或两个以上独立或者相关属性的数据。高维指数据具有多个独立属性,多元指数据具有多个相关属性。由于研究者在很多情况下不确定数据的属性是否独立,因此通...
  • gdp12315
  • gdp12315
  • 2015-07-13 18:41:28
  • 2708

如何创建一个四维的矩阵,存储多个3通道彩色图片

分别对两张图像进行读入,可以把每张彩色图像存储为一个三维矩阵(width*height*channel) eg:  img1=imread('1.jpg');        img2=imread('...
  • liuxiabing150
  • liuxiabing150
  • 2015-06-16 16:39:56
  • 1443

浅谈高维数据可视化中的降维方法

我们生活在三维空间中,很难直接理解三维以上的空间(爱因斯坦等牛人除外)。但是爱因斯坦这样的人毕竟在人群中是少数,对大多数人来说,高维数据如何进行可视化呢? 聪明的人可以用其他的视觉通道对一些维度进行...
  • u011001084
  • u011001084
  • 2016-05-13 16:30:25
  • 2621
收藏助手
不良信息举报
您举报文章:流形学习-高维数据的降维与可视化
举报原因:
原因补充:

(最多只允许输入30个字)