HOOOS

t-SNE 的灵魂:揭秘 t 分布,解决数据拥挤难题

0 62 数据挖掘小能手 t-SNEt分布降维可视化机器学习
Apple

嘿,哥们儿,听说你对 t-SNE 挺感兴趣?想深入了解一下它里面那些门道?好嘞,今天咱们就来聊聊 t-SNE 算法里头那个特别有意思的家伙——t 分布。这家伙可是 t-SNE 的灵魂,它决定了 t-SNE 到底能不能把高维数据给咱们“摊”开,解决数据点挤成一堆的问题。

咱们先来个开胃菜:t-SNE 是个啥?

在开始聊 t 分布之前,咱得先明确一下 t-SNE 是个啥。简单来说,t-SNE 是一种用于降维的算法,尤其擅长把高维数据“画”在二维或三维平面上,方便咱们可视化。想象一下,你有一堆乱七八糟的数据,每个数据点都有好多特征,就像一个复杂的游戏角色,有力量、敏捷、智力等等各种属性。t-SNE 就像一个神奇的魔法师,能把这些复杂的数据点“变”成平面上的点,而且还能尽量保持原始数据点之间的“亲疏”关系。也就是说,原本在高维空间里离得很近的点,在二维平面上也会离得很近;原本离得很远的点,在二维平面上也会离得很远。

问题是,这个魔法怎么变呢?

t-SNE 的核心:概率大法好

t-SNE 算法的核心思想是概率分布。它在高维空间和低维空间里都定义了概率分布,然后努力让这两个概率分布尽可能地相似。怎么个相似法儿呢?咱们得先搞清楚这两个概率分布是啥样的。

高维空间的“亲疏”关系:高斯分布

在高维空间里,t-SNE 使用的是高斯分布(也叫正态分布)来衡量数据点之间的相似度。具体来说,对于每个数据点 xi,t-SNE 会计算它与其他所有数据点之间的欧氏距离。然后,根据这些距离,构建一个条件概率分布,记作 p(j|i)。这个 p(j|i) 表示的是,在给定数据点 xi 的情况下,数据点 xj 被选为 xi 的“邻居”的概率。公式长这样:

p(j|i) = (exp(-||xi - xj||^2 / 2σi^2)) / Σk≠i (exp(-||xi - xk||^2 / 2σi^2))
  • xi 和 xj:分别代表两个不同的数据点。
  • ||xi - xj||:代表 xi 和 xj 之间的欧式距离,也就是它们在特征空间里的直线距离。
  • σi:这个家伙叫做“方差”,它决定了以 xi 为中心的高斯分布的“胖瘦”。σi 的大小会根据数据点 xi 周围的密度进行调整。如果 xi 周围的数据点比较密集,那么 σi 就会比较小,反之,如果 xi 周围的数据点比较稀疏,那么 σi 就会比较大。
  • exp:就是自然指数函数,e 的多少次方。
  • Σk≠i:表示对所有不等于 i 的 k 求和。

简单来说,如果 xj 离 xi 越近,那么 p(j|i) 就会越大,表示 xj 是 xi 的“邻居”的可能性就越高。反之,如果 xj 离 xi 越远,那么 p(j|i) 就会越小。

低维空间的“亲疏”关系:t 分布登场!

到了低维空间,t-SNE 也需要衡量数据点之间的相似度。但是,它没有直接使用高斯分布,而是选择了t 分布。这才是咱们今天的主角!

在低维空间里,咱们的目标是找到每个数据点 xi 对应的低维表示 yi。同样,t-SNE 会计算 yi 与其他所有低维数据点之间的欧氏距离。然后,基于这些距离,构建一个概率分布,记作 q(j|i)。这个 q(j|i) 表示的是,在给定低维数据点 yi 的情况下,数据点 yj 被选为 yi 的“邻居”的概率。公式长这样:

q(j|i) = ( (1 + ||yi - yj||^2)^-1 ) / Σk≠l ( (1 + ||yk - yl||^2)^-1 )
  • yi 和 yj:分别代表两个不同的低维数据点。
  • ||yi - yj||:代表 yi 和 yj 之间的欧式距离。
  • Σk≠l:表示对所有不等于 l 的 k 求和。

重点来了,这个公式里用的是 t 分布!它和高斯分布不一样的地方在于,它有一个长尾。也就是说,即使两个点在低维空间里离得比较远,它们之间的概率 q(j|i) 也不一定特别小。这跟高斯分布可不一样,高斯分布的尾巴衰减得很快,如果两个点离得远,那么它们之间的概率就会变得非常小。

t 分布的“长尾”特性:解决拥挤问题的关键

t 分布的“长尾”特性,是 t-SNE 能够解决“拥挤问题”的关键。咱们来好好聊聊这个。

什么是“拥挤问题”?

在降维的时候,特别是把高维数据降到二维或者三维的时候,很容易出现一个问题:数据点挤成一堆,看不清数据的结构。这就像一群人挤在一个小房间里,你根本看不清谁是谁。这主要是因为高维空间里,数据点之间的距离关系比较复杂,而低维空间能够表达的信息有限,很难完美地保留高维空间里的所有距离关系。如果直接用高斯分布,那么离得比较远的点,在低维空间里也会被推得很远。这样一来,那些原本在高维空间里距离比较近的点,在低维空间里就会挤成一团。

t 分布的“长尾”如何解决拥挤?

t 分布的“长尾”特性就派上用场了。因为 t 分布的尾巴比较“长”,所以即使两个点在低维空间里离得比较远,它们之间的概率 q(j|i) 也不至于变得特别小。这意味着,t-SNE 在低维空间里,允许原本在高维空间里距离比较远的点,在低维空间里稍微“靠”得近一些。这样,那些原本在高维空间里距离比较近的点,在低维空间里就不会挤成一团,而是可以稍微“分散”开一些,从而更好地揭示数据的结构。

打个比方,假设你现在要安排一群朋友去看电影。如果用高斯分布,就像你给每个人都规定了座位,而且座位之间的距离必须严格按照他们的关系来。关系特别好的,座位必须挨着;关系一般的,座位稍微隔开一点;关系不好的,座位必须离得远远的。这样一来,很容易出现“座位不够”的问题,导致大家挤成一团,体验很差。如果用 t 分布,就像你给每个人都规定了一个“舒适区”,在这个舒适区里,大家可以随便坐。即使两个人的关系不太好,他们也可以坐在彼此的舒适区里,而不会觉得特别难受。这样,就可以避免“拥挤问题”,让大家都有一个比较舒适的观影体验。

t-SNE 的优化目标:让高维和低维的概率分布“同步”

前面说了,t-SNE 的目标是让高维空间和低维空间的概率分布尽可能地相似。具体来说,它通过最小化一个损失函数来实现这个目标。这个损失函数通常是KL 散度(Kullback-Leibler divergence),它衡量了两个概率分布之间的差异。损失函数的公式长这样:

C = Σi Σj p(j|i) log (p(j|i) / q(j|i))
  • C:就是损失函数的值,咱们的目标是让它尽可能小。
  • p(j|i):高维空间里的概率分布。
  • q(j|i):低维空间里的概率分布。
  • log:自然对数。
  • Σi Σj:表示对所有数据点 i 和 j 求和。

这个损失函数的意思是,如果高维空间和低维空间的概率分布差异越大,那么损失函数的值就会越大。t-SNE 通过不断调整低维数据点 yi 的位置,来最小化这个损失函数。调整的过程,就像咱们玩游戏一样,不断尝试、不断调整,直到找到一个“最优解”,让损失函数的值最小。

总结:t 分布,让 t-SNE 更有“弹性”

总而言之,t 分布是 t-SNE 算法里一个非常重要的组成部分。它的“长尾”特性,让 t-SNE 在降维的时候,能够更好地处理数据点之间的距离关系,避免“拥挤问题”,从而更好地揭示数据的结构。可以说,t 分布让 t-SNE 算法更有“弹性”,能够适应各种各样的数据。

咱们再聊点技术细节:参数调优

光知道 t 分布还不够,要想真正用好 t-SNE,还得学会怎么调参数。下面咱们就来聊聊 t-SNE 算法中几个重要的参数。

1. 困惑度(Perplexity)

困惑度是 t-SNE 算法中最重要的一个参数,它控制着每个数据点邻域的大小。简单来说,困惑度可以理解为“每个数据点有多少个邻居”。一般来说,困惑度的取值范围是 5 到 50 之间。如果困惑度太小,那么 t-SNE 就会过于关注局部结构,而忽略全局结构,导致“小团簇”现象。如果困惑度太大,那么 t-SNE 就会过于关注全局结构,而忽略局部结构,导致“整体一团”现象。所以,选择合适的困惑度非常重要。通常情况下,可以尝试不同的困惑度值,然后根据可视化结果来选择最合适的。

2. 学习率(Learning Rate)

学习率是 t-SNE 算法中的另一个重要参数,它控制着梯度下降的步长。梯度下降是 t-SNE 算法中用来优化低维数据点位置的算法。学习率越大,梯度下降的步长就越大,收敛速度就越快,但是也容易出现震荡。学习率越小,梯度下降的步长就越小,收敛速度就越慢,但是也更稳定。通常情况下,可以从 100 开始尝试,然后根据情况调整。

3. 迭代次数(Number of Iterations)

迭代次数是指 t-SNE 算法中梯度下降的次数。迭代次数越多,t-SNE 算法的优化效果就越好,但是计算时间也会越长。通常情况下,可以设置 200 到 1000 次迭代。

4. 其他参数

除了上面这三个参数之外,t-SNE 算法还有一些其他的参数,比如初始化方式、优化器等等。这些参数的影响相对较小,可以根据具体情况进行调整。

案例分析:看看 t-SNE 的实际应用

说了这么多理论,咱们再来看几个实际的案例,看看 t-SNE 到底能干啥。

案例一:手写数字识别

假设你有一堆手写数字的图片,每个图片都是 28x28 像素的灰度图。那么,每个图片就可以表示成一个 784 维的向量。你可以用 t-SNE 把这些 784 维的向量降到二维,然后把它们“画”在平面上。你会发现,相同数字的图片会聚在一起,形成一个个“簇”。这样,你就可以直观地看到不同数字之间的相似性,而且还可以用它来做数字识别。

案例二:文本数据可视化

假设你有一堆文本数据,比如新闻文章或者用户评论。你可以用词袋模型或者 Word2Vec 把这些文本数据转换成向量。然后,你可以用 t-SNE 把这些向量降到二维,然后把它们“画”在平面上。你会发现,主题相关的文本数据会聚在一起,形成一个个“簇”。这样,你就可以直观地看到不同文本数据之间的相似性,而且还可以用它来做文本聚类或者主题分析。

案例三:基因表达数据分析

假设你有一堆基因表达数据,每个样本都有成千上万个基因的表达量。你可以用 t-SNE 把这些高维的基因表达数据降到二维,然后把它们“画”在平面上。你会发现,不同类型的细胞或者组织会聚在一起,形成一个个“簇”。这样,你就可以直观地看到不同细胞或者组织之间的差异性,而且还可以用它来做细胞分类或者疾病诊断。

常见问题与注意事项

1. t-SNE 的结果不唯一

t-SNE 算法的结果是不确定的,每次运行的结果可能会略有不同。这是因为 t-SNE 算法的优化过程是一个随机过程,它依赖于随机初始化的过程。为了获得更稳定的结果,可以多次运行 t-SNE 算法,然后取平均值或者选择最好的结果。

2. t-SNE 的计算量比较大

t-SNE 算法的计算量比较大,特别是对于大规模数据集。这是因为 t-SNE 算法需要计算所有数据点之间的距离,而且需要进行多次迭代。为了提高计算效率,可以采用一些优化技巧,比如使用 PCA 进行预处理,或者使用并行计算。

3. t-SNE 只能用于可视化,不能用于分类或者预测

t-SNE 算法是一种降维算法,它的主要目的是可视化数据,而不是用于分类或者预测。虽然 t-SNE 可以用来发现数据中的结构,但是不能直接用于分类或者预测。如果需要进行分类或者预测,需要使用其他的机器学习算法。

4. 关于“噪音点”

t-SNE 在处理高维数据时,可能会受到“噪音点”的影响。噪音点指的是那些与大多数数据点都不相似的点。由于 t-SNE 算法的优化目标是最小化所有数据点之间的距离,所以噪音点可能会导致 t-SNE 的结果出现偏差。为了解决这个问题,可以采用一些预处理的技巧,比如去除噪音点,或者使用鲁棒的距离度量方法。

总结:t-SNE 的魅力与局限

总而言之,t-SNE 是一种非常强大的降维算法,它能够将高维数据可视化,并且能够揭示数据中的结构。t-SNE 的核心在于 t 分布,它的“长尾”特性是解决“拥挤问题”的关键。当然,t-SNE 也有一些局限性,比如计算量比较大,结果不确定等等。但是,总的来说,t-SNE 仍然是一种非常有用的工具,可以帮助咱们更好地理解和分析数据。

希望今天的讲解对你有所帮助!如果你还有什么问题,欢迎随时提出来,咱们一起探讨!

点评评价

captcha
健康