python画长尾图_t-SNE完整笔记 (附Python代码)

t-SNE是一种非线性降维算法,用于高维数据的可视化,由SNE发展而来。它通过将高维数据映射到2或3维,保留局部结构,解决拥挤问题。t-SNE利用t分布而非高斯分布,更好地处理长尾分布,避免局部最优。文章介绍了SNE的基本原理、t-SNE的改进和优化方法,以及优化过程中的技巧,并提供了算法实现代码。
摘要由CSDN通过智能技术生成

t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法,是由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出来。此外,t-SNE 是一种非线性降维算法,非常适用于高维数据降维到2维或者3维,进行可视化。

t-SNE是由SNE(Stochastic Neighbor Embedding, SNE; Hinton and Roweis, 2002)发展而来。我们先介绍SNE的基本原理,之后再扩展到t-SNE。最后再看一下t-SNE的实现以及一些优化。

1.SNE

1.1基本原理

SNE是通过仿射(affinitie)变换将数据点映射到概率分布上,主要包括两个步骤:SNE构建一个高维对象之间的概率分布,使得相似的对象有更高的概率被选择,而不相似的对象有较低的概率被选择。

SNE在低维空间里在构建这些点的概率分布,使得这两个概率分布之间尽可能的相似。

我们看到t-SNE模型是非监督的降维,他跟kmeans等不同,他不能通过训练得到一些东西之后再用于其它数据(比如kmeans可以通过训练得到k个点,再用于其它数据集,而t-SNE只能单独的对数据做操作,也就是说他只有fit_transform,而没有fit操作)

1.2 SNE原理推导

SNE是先将欧几里得距离转换为条件概率来表达点与点之间的相似度。具体来说,给定一个N个高维的数据 \(x_1, ... , x_N\)(注意N不是维度), t-SNE首先是计算概率\(p_{ij}\),正比于\(x_i\)和\(x_j\)之间的相似度(这种概率是我们自主构建的),即:

\[{p_ {j \mid i} = \frac{\exp(- \mid \mid x_i -x_j \mid \mid ^2 / (2 \sigma^2_i ))} {\sum_{k \neq i} \exp(- \mid \mid x_i - x_k \mid \mid ^2 / (2 \sigma^2_i))}}\]

这里的有一个参数是\(\sigma_i\),对于不同的点\(x_i\)取值不一样,后续会讨论如何设置。此外设置\(p_{x \mid x}=0\),因为我们关注的是两两之间的相似度。

那对于低维度下的\(y_i\),我们可以指定高斯分布为方差为\(\frac{1}{\sqrt{2}}\),因此它们之间的相似度如下:

\[{q_ {j \mid i} = \frac{\exp(- \mid \mid x_i -x_j \mid \mid ^2)} {\sum_{k \neq i} \exp(- \mid \mid x_i - x_k \mid \mid ^2)}}\]

同样,设定\(q_{i \mid i} = 0\).

如果降维的效果比较好,局部特征保留完整,那么 \(p_{i \mid j} = q_{i \mid j}\), 因此我们优化两个分布之间的距离-KL散度(Kullback-Leibler divergences),那么目标函数(cost function)如下:

\[C = \sum_i KL(P_i \mid \mid Q_i) = \sum_i \sum_j p_{j \mid i} \log \frac{p_{j \mid i}}{q_{j \mid i}}\]

这里的\(P_i\)表示了给定点\(x_i\)下,其他所有数据点的条件概率分布。需要注意的是KL散度具有不对称性,在低维映射中不同的距离对应的惩罚权重是不同的,具体来说:距离较远的两个点来表达距离较近的两个点会产生更大的cost,相反,用较近的两个点来表达较远的两个点产生的cost相对较小(注意:类似于回归容易受异常值影响,但效果相反)。即用较小的 \(q_{j \mid i}=0.2\) 来建模较大的 \(p_{j \mid i}=0.8\), cost=\(p \log(\frac{p}{q})\)=1.11,同样用较大的\(q_{j \mid i}=0.8\)来建模较大的\(p_{j \mid i}=0.2\), cost=-0.277, 因此,SNE会倾向于保留数据中的局部特征。思考:了解了基本思路之后,你会怎么选择\(\sigma\),固定初始化?

下面我们开始正式的推导SNE。首先不同的点具有不同的\(\sigma_i\),\(P_i\)的熵(entropy)会随着\(\sigma_i\)的增加而增加。SNE使用困惑度(perplexity)的概念,用二分搜索的方式来寻找一个最佳的\(\sigma\)。其中困惑度指:

\[Perp(P_i) = 2^{H(P_i)}\]

这里的\(H(P_i)\)是\(P_i\)的熵,即:

\[H(P_i) = -\sum_j p_{j \mid i} \log_2 p_{j \mid i}\]

困惑度可以解释为一个点附近的有效近邻点个数。SNE对困惑度的调整比较有鲁棒性,通常选择5-50之间,给定之后,使用二分搜索的方式寻找合适的\(\sigma\)

那么核心问题是如何求解梯度了,目标函数等价于\(\sum \sum - p log(q)\)这个式子与softmax非常的类似,我们知道softmax的目标函数是\(\sum -y \log p\),对应的梯度是\(y - p\)(注:这里的softmax中y表示label,p表示预估值)。 同样我们可以推导SNE的目标函数中的i在j下的条件概率情况的梯度是\(2(p_{i \mid j}-q_{i \mid j})(y_i-y_j)\), 同样j在i下的条件概率的梯度是\(2(p_{j \mid i}-q_{j \mid i})(y_i-y_j)\), 最后得到完整的梯度公式如下:

\[\frac{\delta C}{\delta y_i} = 2 \sum_j (p_{j \mid i} - q_{j \mid i} + p_{i \mid j} - q_{i \mid j})(y_i - y_j)\]

在初始化中,可以用较小的\(\sigma\)下的高斯分布来进行初始化。为了加速优化过程和避免陷入局部最优解,梯度中需要使用一个相对较大的动量(momentum)。即参数更新中除了当前的梯度,还要引入之前的梯度累加的指数衰减项,如下:

\[Y^{(t)} = Y^{(t-1)} + \eta \frac{\delta C}{\delta Y} + \alpha(t)(Y^{(t-1)} - Y^{(t-2)})\]

这里的\(Y^{(t)}\)表示迭代t次的解,\(\eta\)表示学习速率,\(\alpha(t)\)表示迭代t次的动量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值