机器学习(三十二)——t-SNE, Adaboost

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

t-SNE(续)

SNE

在介绍t-SNE之前,我们首先介绍一下SNE(Stochastic Neighbor Embedding)的原理。

假设我们有数据集X,它共有N个数据点。每一个数据点 x i 的维度为D,我们希望降低为d维。在一般用于可视化的条件下,d的取值为 2,即在平面上表示出所有数据。

SNE将数据点间的欧几里德距离转化为条件概率来表征相似性:

p j i = exp ( x i x j 2 / 2 σ 2 ) k i exp ( x i x k 2 / 2 σ 2 )

如果以数据点在 x i 为中心的高斯分布所占的概率密度为标准选择近邻,那么 p j i 就代表 x i 将选择 x j 作为它的近邻。对于相近的数据点,条件概率 p j i 是相对较高的,然而对于分离的数据点, p j i 几乎是无穷小量(若高斯分布的方差 σ i 选择合理)。

现在引入矩阵Y,Y是N*2阶矩阵,即输入矩阵X的2维表征。基于矩阵Y,我们可以构建一个分布q,其形式与p类似。

对于高维数据点 x i x j 在低维空间中的映射点 y i y j ,计算一个相似的条件概率 q j i 是可以实现的。我们将计算条件概率 q i j 中用到的高斯分布的方差设置为1/2。因此我们可以对映射的低维数据点 y j y i 之间的相似度进行建模:

q j i = exp ( y i y j 2 ) k i exp ( y i y k 2 )

我们的总体目标是选择Y中的一个数据点,然后其令条件概率分布q近似于p。这一步可以通过最小化两个分布之间的KL散度而实现,这一过程可以定义为:

C = i K L ( P i Q i ) = i j p j i log p j i q j i

这里的 P i 表示了给定点 x i 下,其他所有数据点的条件概率分布。需要注意的是KL散度具有不对称性,在低维映射中不同的距离对应的惩罚权重是不同的,具体来说:距离较远的两个点来表达距离较近的两个点会产生更大的cost,相反,用较近的两个点来表达较远的两个点产生的cost相对较小(注意:类似于回归容易受异常值影响,但效果相反)。即用较小的 q j i = 0.2 来建模较大的 p j i = 0.8 c o s t = p log ( p / q ) = 1.11 ,同样用较大的 q j i = 0.8 来建模较小的 p j i = 0.2 , c o s t = 0.277 。因此,SNE会倾向于保留数据中的局部特征

如何确定 σ

下面介绍一下SNE的超参 σ 的确定方法。

首先,不同的点具有不同的 σ i P i 的熵(entropy)会随着 σ i 的增加而增加。SNE使用困惑度(perplexity)的概念,用二分搜索的方式来寻找一个最佳的 σ 。其中困惑度指:

P e r p ( P i ) = 2 H ( P i )

这里的 H ( P i ) P i 的熵,即:

H ( P i ) = j p j i log 2 p j i

困惑度可以解释为一个点附近的有效近邻点个数。SNE对困惑度的调整比较有鲁棒性,通常选择5-50之间。

在初始优化的阶段,每次迭代中可以引入一些高斯噪声,之后像模拟退火一样逐渐减小该噪声,可以用来避免陷入局部最优解。因此,SNE在选择高斯噪声,以及学习速率,什么时候开始衰减,动量选择等等超参数上,需要跑多次优化才可以。

Symmetric SNE

优化 p i j q i j 的KL散度的一种替换思路是,使用联合概率分布来替换条件概率分布,即P是高维空间里各个点的联合概率分布,Q是低维空间里各个点的联合概率分布,目标函数为:

C = K L ( P ∣∣ Q ) = i j p i , j log p i j q i j

如果我们假设对于任意i,有 p i j = p j i , q i j = q j i ,则概率分布可以改写为:

p i j = exp ( ∣∣ x i x j 2 / 2 σ 2 ) k l exp ( ∣∣ x k x l 2 / 2 σ 2 )         q i j = exp ( ∣∣ y i y j 2 ) k l exp ( ∣∣ y k y l 2 )

我们将这种SNE称之为symmetric SNE(对称SNE)。

t-SNE

SNE的主要问题在于存在Crowding问题:就是说各个簇聚集在一起,无法区分。比如有一种情况,高维度数据在降维到10维下,可以有很好的表达,但是降维到两维后无法得到可信映射,比如降维如10维中有11个点之间两两等距离的,在二维下就无法得到可信的映射结果(最多3个点)。

其中的一种减轻”拥挤问题”的方法:在高维空间下,在高维空间下我们使用高斯分布将距离转换为概率分布,在低维空间下,我们使用更加偏重长尾分布的方式来将距离转换为概率分布,使得高维度下中低等的距离在映射后能够有一个较大的距离。

我们对比一下高斯分布和t分布, t分布受异常值影响更小,拟合结果更为合理,较好的捕获了数据的整体特征。

使用了t分布之后的q变化,如下:

q i j = ( 1 + ∣∣ y i y j 2 ) 1 k l ( 1 + ∣∣ y i y j 2 ) 1

这里写图片描述

t-sne的有效性,也可以从上图中看到:横轴表示距离,纵轴表示相似度, 可以看到,对于较大相似度的点,t分布在低维空间中的距离需要稍小一点;而对于低相似度的点,t分布在低维空间中的距离需要更远。这恰好满足了我们的需求,即同一簇内的点(距离较近)聚合的更紧密,不同簇之间的点(距离较远)更加疏远。

总结一下,t-SNE的梯度更新有两大优势:

对于不相似的点,用一个较小的距离会产生较大的梯度来让这些点排斥开来。

这种排斥又不会无限大(梯度中分母),避免不相似的点距离太远。

这里写图片描述

这里写图片描述

上图分别是使用t-SNE和Sammon mapping可视化MNIST数据集后的效果图。从中可以看出t-SNE图中,数据更成团状,可视化效果更好。

t-SNE的不足主要有四个:

主要用于可视化,很难用于其他目的。比如测试集合降维,因为他没有显式的预估部分,不能在测试集合直接降维;比如降维到10维,因为t分布偏重长尾,1个自由度的t分布很难保存好局部特征,可能需要设置成更高的自由度。

t-SNE倾向于保存局部特征,对于本征维数(intrinsic dimensionality)本身就很高的数据集,是不可能完整的映射到2-3维的空间

t-SNE没有唯一最优解,且没有预估部分。如果想要做预估,可以考虑降维之后,再构建一个回归方程之类的模型去做。但是要注意,t-sne中距离本身是没有意义,都是概率分布问题。

训练太慢。有很多基于树的算法在t-sne上做一些改进。

参考

https://www.zhihu.com/question/52022955

t-sne数据可视化算法的作用是啥?为了降维还是认识数据?

https://mp.weixin.qq.com/s/Rs9ri6Xs5R-yitrda8pJMg

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

https://mp.weixin.qq.com/s/_DXMlNZHVKm2jMnLGQFM_Q

还在用PCA降维?快学学大牛最爱的t-SNE算法吧

http://www.datakit.cn/blog/2017/02/05/t_sne_full.html

t-SNE完整笔记

https://yq.aliyun.com/articles/70733

比PCA降维更高级——(R/Python)t-SNE聚类算法实践指南

https://mp.weixin.qq.com/s/7Vy7l1YyBT7rMYW2i1AsuA

线性判别分析(LDA)原理详解

https://mp.weixin.qq.com/s/cnzQ7XepftDOZXslCf1MUA

你真的会用t-SNE么?有关t-SNE的小技巧

https://mp.weixin.qq.com/s/lbpe2NO1m8S38wpnp47BEg

通过可视化隐藏表示,更好地理解神经网络

Adaboost

Adaboost是Yoav Freund和Robert Schapire于1997年提出的算法。两人后来因为该算法被授予Gödel Prize(2003)。

Yoav Freund,UCSC博士,UCSD教授。

Robert Elias Schapire,MIT博士。先后供职于Princeton University、AT&T Labs和Microsoft Research。

Gödel Prize,由欧洲计算机学会(EATCS)与美国计算机学会基础理论专业组织(ACM SIGACT)于1993年共同设立,颁给理论计算机领域最杰出的学术论文。其名称取自Kurt Gödel。

Kurt Friedrich Gödel,1906~1978,奥地利逻辑学家,数学家,哲学家,后加入美国藉。维也纳大学博士(1930)。在逻辑学方面,他是继Aristotle、Gottlob Frege之后最伟大的逻辑学家。在数学方面,他以哥德尔不完备定理著称,和Bertrand Russell、 David Hilbert、Georg Cantor齐名。

Adaboost既可用于分类问题,也可用于回归问题。这里仅针对二分类问题进行讨论。

假设我们有数据集 { ( x 1 , y 1 ) , , ( x N , y N ) } ,其中 y i { 1 , 1 } ,还有一系列弱分类器 { k 1 , , k L }

由于Boost算法是个串行算法,每次迭代就会加入一个弱分类器。这样m-1次迭代之后的分类器如下所示:

C ( m 1 ) ( x i ) = α 1 k 1 ( x i ) + + α m 1 k m 1 ( x i )

而m次迭代之后的分类器则为:

C m ( x i ) = C ( m 1 ) ( x i ) + α m k m ( x i )

如何选择新加入的弱分类器 k m 和对应的权重 α m 呢?我们可以定义误差E如下所示:

E = i = 1 N e y i C m ( x i )

w i ( 1 ) = 1 , w i ( m ) = e y i C m 1 ( x i ) ,则:

E = i = 1 N w i ( m ) e y i α m k m ( x i )

因为 k m 分类正确时, y i k m ( x i ) = 1 ,分类错误时, y i k m ( x i ) = 1 。所以:

E = y i = k m ( x i ) w i ( m ) e α m + y i k m ( x i ) w i ( m ) e α m = i = 1 N w i ( m ) e α m + y i k m ( x i ) w i ( m ) ( e α m e α m )

可以看出和 k m 相关的实际上只有上式的右半部分。显然,使得 y i k m ( x i ) w i ( m ) 最小的 k m ,也会令E最小,这也就是我们选择加入的 k m

对E求导,得:

d E d α m = d ( y i = k m ( x i ) w i ( m ) e α m + y i k m ( x i ) w i ( m ) e α m ) d α m

令导数为0,可得:

α m = 1 2 ln ( y i = k m ( x i ) w i ( m ) y i k m ( x i ) w i ( m ) )

ϵ m = y i k m ( x i ) w i ( m ) / i = 1 N w i ( m ) ,则:

α m = 1 2 ln ( 1 ϵ m ϵ m )

参考:

https://mp.weixin.qq.com/s/G06VDc6iTwmNGsH4IfSeJQ

Adaboost从原理到实现

https://mp.weixin.qq.com/s/PZ-1fkNvdJmv_8zLbvoW1g

Adaboost算法原理小结

https://mp.weixin.qq.com/s/KoOUgwXLOfJfOjWhbFX52Q

如果Boosting你懂,那Adaboost你懂么?

https://mp.weixin.qq.com/s/Joz2FpGgBY0tC8lpoFz8Mw

AdaBoost元算法如何提高分类性能——机器学习实战

https://mp.weixin.qq.com/s/MLEVUKse5usmKIWJF-yfOQ

通俗易懂讲解自适应提升算法AdaBoost

猜你喜欢

转载自blog.csdn.net/antkillerfarm/article/details/82732598
今日推荐