t-sne初见

直接用了下from sklearn.manifold import TSNE,用的默认参数,感觉效果并不好,尝试了3维数据,明明算法在三维上能很好地找到outliers,但是投影到二维,画出来离群点很不明显,看起来是三个簇,尝试从原理上理解,并尝试调参,看是否投影后能distinct离群点。
原理好像不是很复杂,只是今天较困, 感觉那些资料也没说清楚,还需要再看看。



T-SNE先要看SNE
SNE是把距离转换成条件概率,固定一个点i,到点j的条件概率,Pj|i,计算方法是有一个高斯分布,中心点是Xi,标准差σ,Xi到Xj的距离,放到分布中,Xj有一个概率密度,Xj的概率密度/∑(Xi到所有点的概率密度),X降维到Y,Y也可以计算每一个点Qj|i,这个时候统一的标准差是1/sqrt(2),每一个Pi和Qi可以求KL散度,所有点的KL散度求和,得到总的KL散度,作为损失函数,目标就是求得一系列Y,使得KL散度最小,Pj|i每一个中心点都有一个σi,每一个点不一样,怎么确定?用户要设置一个叫做困惑度的参数,通过这个参数可以求出σ的大小,困惑度可以理解成有效近邻点的个数,然后就是求解损失函数C,梯度下降法求解,损失函数C对yi求偏导,实际迭代的时候加了一项,指数衰减项,为了提高求解速度并且避免局部最优解。损失函数,优化早期,还要引入高斯噪声和模拟退火,目的仍然是防止陷入局部最优。

SNE有两大缺点:
1.很难优化
2.拥挤问题

缺点1的解决方案是使用对称SNE
缺点2的解决方案是低维空间使用自由度1的t分布
最后就演变成了t-sne


留言

熱門文章