几种常用的流形学习算法(MDS、t-SNE、KNN图、K-D树)

Multidimensional Scaling (MDS)

  Isomap 所改造的这个方法叫做 Multidimensional Scaling (MDS) ,MDS 是一种线性降维方法。   它的目的就是使得降维之后的点两两之间的距离尽量不变(也就是和在原是空间中对应的两个点之间的距离要差不多)。只是 MDS 是针对欧氏空间设计的,对于距离的计算也是使用欧氏距离来完成的。如果数据分布在一个流形上的话,欧氏距离就不适用了。


t-SNE embedding

  t-分布邻域嵌入算法,非线性降维方法(一般用于可视化),成功的应用于很多真实数据集。属于非监督学习,属于流形学习。
  t-SNE是深度学习大牛Hinton和lvdmaaten在2008年提出的。
  所谓的t-SNE算法,总结一下其实就是在SNE的基础上增加了两个改进:一是把SNE变为对称SNE,二是在低维空间中采用了tt分布代替原来的高斯分布,高维空间不变。

使用场合

  t-sne本身可以用于降维,但是主要被用于可视化,而且可视化效果非常好。kaggle里有些人会把t-SNE降维后的数据当做feature。
  有人用t-sne看CNN中全连接层的数据,发现相似的会聚在一起。
  t-sne不能算是一种通用的降维方法吧,时间复杂度也挺高的。
  降维是手段,认识数据是目的。

t-SNE的改进

  就是各种树算法轮番上阵。
  2014年的时候,Maaten又写了一篇论文对t-SNE算法进行了改进,使用了各种基于树的算法,具体包括两部分内容:一是采用了kNN图来表示高维空间中点的相似性;二是优化了梯度的求解过程,将梯度计算分为引力和斥力两部分,同样使用了一些优化技巧。
  虽然t-SNE算法和它的改进算法都得到广泛应用,但存在两个不足:一是处理大规模高维数据时,t-SNE的效率显著降低(包括改进后的算法);二是t-SNE中的参数对不同数据集较为敏感,我们辛辛苦苦的在一个数据集上调好了参数,得到了一个不错的可视化效果,却发现不能在另一个数据集上适用,还得花费大量时间寻找合适的参数。


LargeVis

  唐建提出的LargeVis基本思路与t-SNE改进算法大致相同,但是LargeVis用到了几个非常漂亮的优化技巧。
  技巧包括:高效kNN图构建算法;高效kNN图构建算法。
  从可视化效果上看,LargeVis与t-SNE是差不多的,在某些数据集上略胜一筹,但是从训练时间上看,LargeVis比t-SNE高效太多。LargeVis的代码还没有放出来。


kNN图(k-Nearest Neighbour Graph)

  实际上是在经典的kNN(k-Nearest Neighbor)算法上增加了一步构图过程。
  假设空间中有nn个节点,对节点vivi,通过某种距离度量方式(欧式距离、编辑距离)找出距离它最近的kk个邻居v1,v2,⋯,vkv1,v2,⋯,vk,然后分别将vivi与这kk个邻居连接起来,形成kk条有向边。对空间中所有顶点均按此方式进行,最后就得到了kNN图。当然,为方便起见,在许多场景中我们往往将kNN图中的有向边视为无向边处理。

kNN图的用途

  在计算流形上的测地线距离时,可以构造基于欧式距离的kNN图得到一个近似。原因很简单,我们可以把一个流形在很小的局部邻域上近似看成欧式的,也就是局部线性的。
  这一点很好理解,比如我们所处的地球表面就是一个流形,在范围较小的日常生活中依然可以使用欧式几何。但是在航海、航空等范围较大的实际问题中,再使用欧式几何就不合适了,使用黎曼几何更加精确。

  kNN图还可用于异常点检测。在大量高维数据点中,一般正常的数据点会聚集为一个个簇,而异常数据点与正常数据点簇的距离较远。通过构建kNN图,可以快速找出这样的异常点。

如何构建KNN图

  常见的方法一般有三类:
  1)第一类是空间分割树(space-partitioning trees)算法;
  2)第二类是局部敏感哈希(locality sensitive hashing)算法
  3)第三类是邻居搜索(neighbor exploring techniques)算法。

  其中有名的是k-d树和随机投影树,均属于第一类算法。

k-d树

  k-d树是一种分割k维数据空间的数据结构,本质上是一棵二叉树。主要用于多维空间关键数据的搜索,如范围搜索、最近邻搜索等。

猜你喜欢

转载自blog.csdn.net/wydbyxr/article/details/83212123