Introduction

在计算机视觉及机器学习领域,数据的可视化是非常重要的一个应用,一般我们处理的数据都是成百上千维的,但是我们知道,目前我们可以感知的数据维度最多只有三维,超出三维的数据是没有办法直接显示出来的,所以需要做降维的处理,数据的降维,简单来说就是将高维度的数据映射到较低的维度,如果要能达到数据可视化的目的,就要将数据映射到二维或者三维空间。数据的降维是一种无监督的学习过程,我们可以看成是一种聚类。数据在空间的分布主要有两个特性,一个是相似性,我们可以用类内距离衡量;一个是差异性,可以用类间距离衡量。降维算法,在将数据从高维空间映射到低维空间的时候,需要考虑数据的这两个分布特性,也就是要保持数据在高维空间的分布特性。

降维的算法有很多,最经典的就是PCA了,也就是我们常说的主分量分析,PCA是基于数据集的协方差矩阵,考虑的更多是数据的差异性,而对于数据的相似性,或者说数据的局部分布,类似PCA的线性降维算法是无能为力的。

今天,我们介绍一种非常高效的非线性降维算法: t-SNE,t-SNE 算法可以非常有效地把高维的数据映射到低维的空间,并且保持数据在高维空间的局部结构。t-SNE 算法是 SNE 算法的一个延伸,SNE 即 Stochastic Neighbor Embedding 的简称,SNE 算法利用了每一个数据点的邻近数据点的分布来做降维。在介绍 t-SNE 之前,我们先来看看 SNE 算法。

Stochastic Neighbor Embedding

给定一个高维的数据集 ={x1,x2,...xn}, 我们需要将这个高维的数据集映射到一个低维的数据集 ={y1,y2,...yn},为了数据便于显示, 的维度一般是二维或者三维。为了衡量高维数据的相似性,SNE算法设置了一个条件概率:

pj|i=exp(−∥xi−xj∥2/(2σ2i))∑k≠iexp(−∥xi−xk∥2/(2σ2i))

pj|i 衡量的是数据点 j 作为数据点 i 的邻域的概率,这个分布类似一个高斯分布,很显然,离xi 越近的点,pj|i 的值越大,而离得越远的点,那么概率就会越小,利用这个条件概率来表示每一对数据点的相似性,因为我们考虑的是数据点与数据点之间的关系,不考虑数据点自身与自身的关系,所以 pi|i=0,σi 是方差,后面会介绍如何设置这个方差。

接下来,我们要考虑映射后的低维空间  的数据分布,同样可以用条件概率来表示:

qj|i=exp(−∥yi−yj∥2)∑k≠iexp(−∥yi−yk∥2)

这里将方差设置为12√,所以高斯函数的分母变为1,如果空间  的数据分布可以很好地拟合数据在空间  的分布,那么两者的条件概率应该是一样的,即 pj|i 和 qj|i 是相等的,基于这一点,SNE算法就是想找到这样一个低维空间,使得数据集在两个空间的条件概率尽可能接近,可以用 Kullback-Leibler divergence 来衡量:

C=∑iKL(Pi∥Qi)=∑i∑jpj|ilogpj|iqj|i

Pi 表示数据集 中所有其他数据点相对xi 的条件概率,Qi 表示数据集 中所有其他数据点相对yi 的条件概率。从上面的表达式可以看出,SNE算法侧重于保持数据的局部结构。为了设置 σi,可以定义一个 perplexity:

Perp(Pi)=2H(Pi)

H(Pi) 就是我们所说的信息熵

H(Pi)=−∑jpj|ilog2pj|i

利用梯度下降算法,我们可以得到如下的表达式:

∂C∂yi=2∑j(pj|i−qj|i+pi|j−qi|j)(yi−yj)

为了加速收敛以及增加鲁棒性,可以引入 momentum term

(t)=(t−1)+η∂C∂+α(t)((t−1)−(t−2))

机器学习: t-Stochastic Neighbor Embedding 降维算法 (一)的更多相关文章

  1. 机器学习: t-Stochastic Neighbor Embedding 降维算法 (二)

    上一篇文章,我们介绍了SNE降维算法,SNE算法可以很好地保持数据的局部结构,该算法利用条件概率来衡量数据点之间的相似性,通过最小化条件概率 pj|i 与 pi|j 之间的 KL-divergence ...

  2. 【ML基础】t-SNE(t-distributed stochastic neighbor embedding)原理及推导

    前言 参考 1. t-SNE原理与推导: 完

  3. 无监督学习:Neighbor Embedding(邻域嵌套)

    一 Manifold Learning 我们要做的是非线性的降维,data是分布在低维空间里面,只是被扭曲到了高维空间. 比如地球的表面是一个二维平面,但是被塞到一个三维空间中. Manifold就是 ...

  4. 四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps

    四大机器学习降维算法:PCA.LDA.LLE.Laplacian Eigenmaps 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映 ...

  5. 【转】四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps

    最近在找降维的解决方案中,发现了下面的思路,后面可以按照这思路进行尝试下: 链接:http://www.36dsj.com/archives/26723 引言 机器学习领域中所谓的降维就是指采用某种映 ...

  6. 机器学习 降维算法: isomap & MDS

    最近在看论文的时候看到论文中使用isomap算法把3D的人脸project到一个2D的image上.提到降维,我的第一反应就是PCA,然而PCA是典型的线性降维,无法较好的对非线性结构降维.ISOMA ...

  7. 机器学习实战基础(二十一):sklearn中的降维算法PCA和SVD(二) PCA与SVD 之 降维究竟是怎样实现

    简述 在降维过程中,我们会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响.同时,在高维数据中,必然有一些特征是不带有有效的信息的(比如噪音),或 ...

  8. 机器学习实战基础(二十):sklearn中的降维算法PCA和SVD(一) 之 概述

    概述 1 从什么叫“维度”说开来 我们不断提到一些语言,比如说:随机森林是通过随机抽取特征来建树,以避免高维计算:再比如说,sklearn中导入特征矩阵,必须是至少二维:上周我们讲解特征工程,还特地提 ...

  9. ML: 降维算法-概述

    机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达, y是数据点映射后的低维向量 ...

随机推荐

  1. [TypeScript] Creating a Class in TypeScript

    Typescript classes make traditional object oriented programming easier to read and write. In this le ...

  2. C++11实现placeholder

    文章分析怎样在C++11中实现简单的placeholder. 首先看看什么是placeholder: for_each(arr.begin(), arr.end(), cerr << _0 ...

  3. Linux 下配置 Python IDE——Emacs

    工欲善其事,必先利其器.Python作为高级语言,因为其简介.灵活已经被越来越多的程序员所青睐.在尝试了众多IDE之后,终于找到了自己的挚爱.废话少说,下面开始说一下如何在linux下安装配置Emac ...

  4. 18.1 IIC驱动程序(基于3.4.2内核)

    驱动使用smbus提供的IIC读写函数可以参考smbus-protocol.txt文档:应用层直接使用IIC读写函数读写IIC设备,应用层读写函数是由i2c-tools这个库提供的(编译的使用和应用程 ...

  5. Centos配置java环境

    安装jdk JDK 是开发Java程序必须安装的软件,我们查看一下 yum 源里面的 JDK:yum list java* 选择适合本机的JDK,并安装:yum install java-1.7.0- ...

  6. php中usort自定义排序如何使用

    php中usort自定义排序如何使用 一.总结 一句话总结:多写一个规则函数,而这个函数的写法和普通函数一样,调用的时候规则函数用函数名的字符串. 1.用户自定义规则函数有哪三个? usort — 使 ...

  7. pthread_join/pthread_exit的使用方法解析

    官方说法: 函数pthread_join用来等待一个线程的结束.函数原型为: extern int pthread_join __P ((pthread_t __th, void **__thread ...

  8. Android图文具体解释属性动画

    Android中的动画分为视图动画(View Animation).属性动画(Property Animation)以及Drawable动画.从Android 3.0(API Level 11)開始. ...

  9. 【转】priority_queue的用法

    http://www.cnblogs.com/flyoung2008/articles/2136485.html priority_queue调用 STL里面的 make_heap(), pop_he ...

  10. leveldb学习:Versionedit和Versionset

    VersionEdit: compact过程中会有一系列改变当前Version的操作(FileNumber添加.删除input的sstable,添加输出的sstable).为了缩小version切换的 ...