(最近看了一个叫光谱特征在后门攻击中的用法,读完之后发现是用了一个SVD也就是奇异值分解做了降维,然后用残差网络的representation层残差与残差的奇异值分解后的右奇异值矩阵的第一行做乘法得到correlation,疑惑得很什么时候相关性可以这么算了。于是想到降维可以不用SVD可以用TSNE,就写一下这一块的东西,融合了别人写的二维和三维的可视化)
t-SNE全称为t-distributed Stochastic Neighbor Embedding,翻译为t-随机邻近嵌入,它是一种embedding模型,用于高维空间中的数据映射到低维空间中,并保留数据集的局部特性,该算法在论文中非常常见,主要用于高维数据的降维和可视化。
t-SNE可以算是目前效果最好的数据降维和可视化方法之一,当我们想对高维数据集进行分类,但又不清楚这个数据集有没有很好的可分性时,可以通过t-SNE将数据投影到2维或3维空间中观察一下:如果在低维空间中具有可分性,则数据是可分的;如果在低维空间中不可分,则可能是因为数据集本身不可分,或者数据集中的数据不适合投影到低维空间。
t-SNE将数据点之间的相似度转化为条件概率,原始空间中数据点的相似度由高斯联合分布表示,嵌入空间中数据点的相似度由学生t分布表示。通过原始空间和嵌入空间的联合概率分布的KL散度(用于评估两个分布的相似度的指标,经常用于评估机器学习模型的好坏)来评估嵌入效果的好坏,即将有关KL散度的函数作为损失函数(loss function),通过梯度下降算法最小化损失函数,最终获得收敛结果。要注意t-SNE的缺点很明显:占用内存较多、运行时间长。
1 降维
首先,通过一个简单的示例看一下t-SNE的降维效果:输入4个5维的数据,通过t-SNE将其降维成2维的数据,代码如下:
import numpy as np
from sklearn.manifold import TSNE
"""将3维数据降维2维"""
# 4个3维的数据
x = np.array([[0, 0, 0, 1, 2], [0, 1, 1, 3, 5], [1, 0, 1, 7, 2], [1, 1, 1, 10,