T 分布随机近邻嵌入t-SNE是一种集降维与可视化于一体的技术,
它是基于SNE(Stochastic Neighbor Embedding, SNE; Hinton and Roweis, 2002)可视化的改进,解决了SNE在可视化后样本分布拥挤、边界不明显的特点,由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出。t-SNE 作为一种非线性降维算法,常用于流行学习(manifold learning)的降维过程中并与LLE进行类比,非常适用于高维数据降维到2维或者3维,是目前最好的降维可视化手段。
当我们想要对高维数据进行分类,又不清楚这个数据集有没有很好的可分性(即同类之间间隔小,异类之间间隔大),可以通过t-SNE投影到2维或者3维的空间中观察一下。t-SNE 主要的优势就是保持局部结构的能力。这意味着高维数据空间中距离相近的点投影到低维中仍然相近。
如果在低维空间中具有可分性,则数据是可分的;如果在高维空间中不具有可分性,可能是数据不可分,也可能仅仅是因为不能投影到低维空间。
1.随机近邻嵌入SNE原理
SNE是通过仿射(affinitie)变换将数据点映射到概率分布上,主要包括两个步骤:
a) SNE构建一个高维对象之间的概率分布,使得相似的对象有更高的概率被选择,而不相似的对象有较低的概率被选择。
b) SNE在低维空间里在构建这些点的概率分布,使得这两个概率分布之间尽可能的相似。
SNE是先将欧几里得距离转换为条件概率来表达点与点之间的相似度。给定一个N个高维的数据
x
1
,
x
2
,
.
.
.
,
x
N
x_1,x_2,...,x_N
x1,x2,...,xN(注意N是数据样本数量,不是维度),
t-SNE首先是计算概率
p
j
∣
i
p_{j|i}
pj∣i,正比于数据点
x
i
x_i
xi与
x
j
x_j
xj之间的相似度(具体的概率密度函数由算法设计人员自主构建),常用的方法使用高维欧几里得距离转换为表示相似性的条件概率,即:
设置
p
i
∣
i
=
0
p_{i|i}=0
pi∣i=0,因为我们关注的是两两之间的相似度。
这里的有一个参数是
σ
i
\sigma_i
σi,对于不同的点
x
i
x_i
xi取值不一样,通常取值为以数据点
x
i
x_i
xi为中心的高斯均方差。
对于低维度下的 y i y_i yi我们可以指定高斯分布的均方差为 1 / 2 1/\sqrt2 1/2,因此它们之间的相似度如下:
q j ∣ i = e x p ( − ∥ y i − y j ∥ 2 / ) ∑ k ≠ i e x p ( − ∥ y i − y k ∥ 2 ) q_{j|i}=\frac{exp(-\left \| y_i-y_j \right \|^2/)}{\sum _{k\neq i}exp(-\left \| y_i-y_k \right \|^2)} qj∣i=∑k=iexp(−∥yi−yk∥2)exp(−∥yi−yj∥2/)
同样,设定 q i ∣ i = 0 q_{i|i}=0 qi∣i=0。
如果降维的效果比较好,局部特征保留完整,那么 q j ∣ i = p j ∣ i q_{j|i}=p_{j|i} qj∣i=pj∣i 。因此我们优化两个概率分布之间的距离即KL散度(Kullback-Leibler divergences)
C = ∑ i K L ( P i ∣ Q i ) = ∑ i ∑ j p j ∣ i l o g { p j ∣ i q j ∣ i } C=\sum _i KL(P_{i}|Q_{i})=\sum _i\sum_j p_{j|i}log\left \{ \frac{p_{j|i}}{q_{j|i}} \right \} C=i∑KL(Pi∣Qi)=i∑j∑pj∣ilog{qj∣ipj∣i}
这里的 P i P_i Pi表示了给定点 x i x_i xi下,其他所有数据点的条件概率分布。需要注意的是KL散度具有不对称
SNE会倾向于保留数据中的局部特征。
SNE使用困惑度(perplexity)的概念,用二分搜索的方式来寻找一个最佳的
σ
\sigma
σ。
困惑度指:
P
e
r
p
(
P
i
)
=
2
H
(
P
i
)
Perp(P_i)=2^{H(P_i)}
Perp(Pi)=2H(Pi)
这里的H(P_i)是P_i的熵,即:
H
(
P
i
)
=
−
∑
j
p
j
∣
i
l
o
g
2
p
j
∣
i
H(P_i)=-\sum_j p_{j|i}log_2p_{j|i}
H(Pi)=−∑jpj∣ilog2pj∣i
困惑度可以解释为一个点附近的有效近邻点个数。SNE对困惑度的调整比较有鲁棒性,通常选择5-50之间,给定之后,使用二分搜索的方式寻找合适的\sigma。
我们可以推导SNE的目标函数中的i在j下的条件概率情况的梯度是
2
(
p
i
∣
j
−
q
i
∣
j
)
(
y
i
−
y
j
)
2(p_{i \mid j}-q_{i \mid j})(y_i-y_j)
2(pi∣j−qi∣j)(yi−yj), 同样j在i下的条件概率的梯度是
2
(
p
j
∣
i
−
q
j
∣
i
)
(
y
i
−
y
j
)
2(p_{j \mid i}-q_{j \mid i})(y_i-y_j)
2(pj∣i−qj∣i)(yi−yj), 最后得到完整的梯度公式如下:
δ
C
δ
y
i
=
2
∑
j
(
p
j
∣
i
−
q
j
∣
i
+
p
i
∣
j
−
q
i
∣
j
)
(
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)
δyiδC=2∑j(pj∣i−qj∣i+pi∣j−qi∣j)(yi−yj)
初始化
在初始化中,可以用较小的σ下的高斯分布来进行初始化。
更新参数
为了加速优化过程和避免陷入局部最优解,梯度中需要使用一个相对较大的动量(momentum)。即参数更新中除了当前的梯度,还要引入之前的梯度累加的指数衰减项,如下:
Y
(
t
)
=
Y
(
t
−
1
)
+
η
δ
C
δ
Y
+
α
(
t
)
(
Y
(
t
−
1
)
−
Y
(
t
−
2
)
)
Y^{(t)} = Y^{(t-1)} + \eta \frac{\delta C}{\delta Y} + \alpha(t)(Y^{(t-1)} - Y^{(t-2)})
Y(t)=Y(t−1)+ηδYδC+α(t)(Y(t−1)−Y(t−2))
这里的 Y ( t ) Y^{(t)} Y(t)表示迭代t次的解, η \eta η表示学习速率, α ( t ) \alpha(t) α(t)表示迭代t次的动量。
在初始优化的阶段,每次迭代中可以引入一些高斯噪声,之后像模拟退火一样逐渐减小该噪声,可以用来避免陷入局部最优解。
t分布
背景
样本量较小的时候, 标准差会无法准确估计。
用样本均值计算出来的方差始终(无论样本均值小于或是大于总体实际均值)比用总体均值计算出来的方差要小
eg
假设我们有一个数据总体的平均值是
2050
2050
2050, 但是统计学家并不知道这件事, 他只能根据抽样的样本来估计总体的均值。 现在假设他获得的样本较少, 为 : 2051,2053,2055,2050,2051
可以算得样本的均值为: 2052
从上述的计算中就可以看到, 如果用总体实际均值计算方差, 其结果应该是
,
很明显是大于等于使用估计均值计算出来的方差
分母为 n−1而非 n 的原因就是为了纠正使用样本均值算出的方差总比实际方差小的问题。
现在我们构建一个随机变量:
就会呈现一个 自由度为 n−1的 T分布, 其中n 是样本的数量。
为什么自由度是 n−1而不是 n?
原因是T值的计算公式中使用了 s,一个隐藏的限制一旦前 n-1个 确定后, 第 n 个
(
x
i
−
x
)
(x_i−x)
(xi−x)立马被锁定。
概述
t 分布奠定了一个名为 t 检验 的科学方法的基础。 该方法曾被吉尼斯黑啤酒酿酒厂用于检验啤酒质量。由于啤酒厂担心竞争者可能会由此发现 T检验的方法, 所以 William Gosset 只能将这个发现以笔名 “学生” 发布, 使得 t-分布也被广泛称为学生分布。
Gosset 的发现后来被著名的统计学家 Ronald Fisher (他被认为是频率论方法的作者)正规化描述。
如上图所示, 当自由度(v = n-1)从小变大的过程中, t-分布逐渐逼近为标准正态分布 。 这是因为当抽样的数量越多, 我们计算出的样本均值就越接近总体的实际均值。 t-分布和标准正态分布相比更为“肥大的尾巴” 补偿了我们进行小样本量抽样时的不确定性。
t-分布的概率密度函数
假设我们希望的得到正态分布变量
X
∼
N
(
0
,
σ
)
X∼N(0,σ)
X∼N(0,σ)
的概率密度函数, 但是不能依赖标准差 σ。 直觉上, 如果我们想避免使用σ , 就需要作出某种假设, 让我们把σ 当做一个随机变量, 假设它遵循伽马分布(Gamma-Distribution, 这是一个在贝叶斯统计中广泛使用的分布 )。
然后我们可以猜测, 变量 X 是两个连续概率分布的混合: 正态分布和伽马分布, 我们对涉及到 σ 的部分进行积分, 提取出来, 就可以得到 t-分布的概率密度函数。
ref
https://blog.csdn.net/lengxiao1993/article/details/81985399?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-3
t-SNE原理
t-SNE(TSNE)将数据点之间的相似度转换为概率。原始空间中的相似度由高斯联合概率表示,嵌入空间的相似度由“学生t分布”表示。
是非监督的降维,它与kmeans等方法不同,它不能通过训练得到一些模型参数后再适用于其它数据(比如kmeans可以通过训练得到 k个点,再用于其它数据集,而 t-SNE只能单独的对数据做操作,也就是说它只有fit_transform,而没有fit操作)。
尽管SNE提供了很好的可视化方法,但是他很难优化,而且存在”crowding problem”(拥挤问题)。后续中,Hinton等人又提出了t-SNE的方法。与SNE不同,主要如下:
- 使用对称版的SNE,简化梯度公式
- 低维空间下,使用t分布替代高斯分布表达两点之间的相似度
对称SNE
使用联合概率分布来替换条件概率分布,即P是高维空间里各个点的联合概率分布,Q是低维空间下的,目标函数为:
C = K L ( P ∣ ∣ Q ) = ∑ i ∑ j p i , j log p i j q i j C = KL(P \mid \mid Q) = \sum_i \sum_j p_{i,j} \log \frac{p_{ij}}{q_{ij}} C=KL(P∣∣Q)=∑i∑jpi,jlogqijpij
假设了对于任意i, p i j = p j i p_{ij} = p_{ji} pij=pji, q i j = q j i q_{ij} = q_{ji} qij=qji,因此概率分布可以改写为:
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 ) p_{ij} = \frac{\exp(- \mid \mid x_i - x_j \mid \mid ^2 / 2\sigma^2)}{\sum_{k \neq l} \exp(- \mid \mid x_k-x_l \mid \mid ^2 / 2\sigma^2)} \ \ \ \ q_{ij} = \frac{\exp(- \mid \mid y_i - y_j \mid \mid ^2)}{\sum_{k \neq l} \exp(- \mid \mid y_k-y_l \mid \mid ^2)} pij=∑k=lexp(−∣∣xk−xl∣∣2/2σ2)exp(−∣∣xi−xj∣∣2/2σ2) qij=∑k=lexp(−∣∣yk−yl∣∣2)exp(−∣∣yi−yj∣∣2)
但是会引入异常值的问题。比如 x i x_i xi是异常值,那么 ∣ ∣ x i − x j ∣ ∣ 2 \mid \mid x_i - x_j \mid \mid ^2 ∣∣xi−xj∣∣2会很大,对应的所有的j, p i j p_{ij} pij都会很小(之前是仅在 x i x_i xi下很小),导致低维映射下的 y i y_i yi对cost影响很小。
为了解决这个问题,我们将联合概率分布定义修正为:
p
i
j
=
p
i
∣
j
+
p
j
∣
i
2
p_{ij} = \frac{p_{i \mid j} + p_{j \mid i}}{2}
pij=2pi∣j+pj∣i 这保证了
∑
j
p
i
j
>
>
1
2
n
\sum_j p_{ij} > \gt {}\frac{1}{2n}
∑jpij>>2n1, 使得每个点对于cost都#会有一定的贡献。对称SNE的最大优点是梯度计算变得简单了,如下:
δ
C
δ
y
i
=
4
∑
j
(
p
i
j
−
q
i
j
)
(
y
i
−
y
j
)
\frac{\delta C}{\delta y_i} = 4 \sum_j (p_{ij} - q_{ij})(y_i - y_j)
δyiδC=4∑j(pij−qij)(yi−yj)
实验中,发现对称SNE能够产生和SNE一样好的结果,有时甚至略好一点。
t-SNE
拥挤问题
拥挤问题就是说各个簇聚集在一起,无法区分。比如有一种情况,高维度数据在降维到10维下,可以有很好的表达,但是降维到两维后无法得到可信映射,比如降维如10维中有11个点之间两两等距离的,在二维下就无法得到可信的映射结果(最多3个点)。
对称SNE实际上在高维度下 另外一种减轻”拥挤问题”的方法:在高维空间下,在高维空间下我们使用高斯分布将距离转换为概率分布,在低维空间下,我们使用更加偏重长尾分布的方式来将距离转换为概率分布,使得高维度下中低等的距离在映射后能够有一个较大的距离。
t分布受异常值影响更小,拟合结果更为合理,较好的捕获了数据的整体特征。
使用了t分布之后的q变化,如下:
q
i
j
=
(
1
+
∣
∣
y
i
−
y
j
∣
∣
2
)
−
1
∑
k
≠
l
(
1
+
∣
∣
y
i
−
y
j
∣
∣
2
)
−
1
q_{ij} = \frac{(1 + \mid \mid y_i -y_j \mid \mid ^2)^{-1}}{\sum_{k \neq l} (1 + \mid \mid y_i -y_j \mid \mid ^2)^{-1}}
qij=∑k=l(1+∣∣yi−yj∣∣2)−1(1+∣∣yi−yj∣∣2)−1
此外,t分布是无限多个高斯分布的叠加,计算上不是指数的,会方便很多。优化的梯度如下:
δ C δ y i = 4 ∑ j ( p i j − q i j ) ( y i − y j ) ( 1 + ∣ ∣ y i − y j ∣ ∣ 2 ) − 1 \frac{\delta C}{\delta y_i} = 4 \sum_j(p_{ij}-q_{ij})(y_i-y_j)(1+ \mid \mid y_i-y_j \mid \mid ^2)^{-1} δyiδC=4∑j(pij−qij)(yi−yj)(1+∣∣yi−yj∣∣2)−1
ref
https://blog.csdn.net/scott198510/article/details/76099700
code
import numpy as np
import matplotlib.pyplot as plt
from sklearn import manifold, datasets
digits = datasets.load_digits(n_class=6)
X, y = digits.data, digits.target
n_samples, n_features = X.shape
'''显示原始数据'''
n = 20 # 每行20个数字,每列20个数字
img = np.zeros((10 * n, 10 * n))
for i in range(n):
ix = 10 * i + 1
for j in range(n):
iy = 10 * j + 1
img[ix:ix + 8, iy:iy + 8] = X[i * n + j].reshape((8, 8))
plt.figure(figsize=(8, 8))
plt.imshow(img, cmap=plt.cm.binary)
plt.xticks([])
plt.yticks([])
plt.show()
'''t-SNE'''
tsne = manifold.TSNE(n_components=2, init='pca', random_state=501)
X_tsne = tsne.fit_transform(X)
print("Org data dimension is {}. Embedded data dimension is {}".format(X.shape[-1], X_tsne.shape[-1]))
'''嵌入空间可视化'''
x_min, x_max = X_tsne.min(0), X_tsne.max(0)
X_norm = (X_tsne - x_min) / (x_max - x_min) # 归一化
plt.figure(figsize=(8, 8))
for i in range(X_norm.shape[0]):
plt.text(X_norm[i, 0], X_norm[i, 1], str(y[i]), color=plt.cm.Set1(y[i]),
fontdict={'weight': 'bold', 'size': 9})
plt.xticks([])
plt.yticks([])
plt.show()
ref
https://blog.csdn.net/hustqb/article/details/78144384?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
https://blog.csdn.net/scott198510/article/details/76099700
http://www.datakit.cn/blog/2017/02/05/t_sne_full.html#5-%E4%BB%A3%E7%A0%81
https://blog.csdn.net/Uwr44UOuQcNsUQb60zk2/article/details/78536805
https://blog.csdn.net/tszupup/article/details/84997804?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2