假设你是婚礼策划师,要在一家宴会厅里为上百位宾客排座。你手里有一份厚厚的社交档案——谁和谁是发小、谁和谁是同事、谁和谁只是点头之交,几十上百条“亲疏线索”叠加起来,构成一个高维空间。但宴会厅只放得下十张圆桌,你必须把这些高维关系“压”进二维平面:让亲密的人坐得近,让陌生的人保持距离。这就是降维,而 t-SNE 是其中最著名的“排座算法”。 t-SNE 的高明之处在于:它不直接硬算“该坐多近”,而是把亲疏关系翻译成两套概率分布——一套描述高维社交圈里的真实亲密程度(高斯分布),一套描述宴会厅低维座位上的实际亲密度(Student-t 分布),再用 KL 散度当“尴尬指数”,反复微调座位,直到两套概率分布尽量吻合。这篇文章,就是带你翻开这位策划师的“排座数学手册”:先看怎么量亲疏,再看怎么定标准,最后看怎么落座、怎么调参。

岗位关联

透彻理解 t-SNE 的分布设计,你将能看懂降维可视化结果的“脾气”:知道什么该信、什么不该信,懂得如何调参、如何规避陷阱,这是做数据探索和算法研究的必修内功。

目录
  1. 可视化演示
  2. 问题起源:把社交圈排进宴会厅
  3. 高维高斯分布:钟形曲线丈量亲疏
  4. 低维Student-t分布:厚尾巴的宽容尺
  5. KL散度:宴会的尴尬指数
  6. 梯度下降:宾客间的引力与斥力
  7. 拥挤问题化解:厚尾为什么能救命
  8. 流程与调参:策划师的实战清单
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示t-SNE背后的概率分布原理的核心机制,通过输入/处理/存储/输出四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

t-SNE背后的概率分布原理:高维空间 高维空间高斯相似度 低维Student-t分布 核心机制可视化 t-SNE背后的概率分布原理整体架构与关键组件

问题起源:把社交圈排进宴会厅

婚礼策划师拿到一份宾客名册:每个人都连着几十上百条社交关系——发小、同事、远亲、球友……这些线索叠加起来,就是“高维空间”。可宴会厅只有二维平面,十张圆桌就是低维空间。排座的目标很简单:把社交关系尽量保留下来,让亲密的人挨着坐、陌生的人隔着坐。这就是降维任务的定义——在信息压缩中最大化保留数据结构。

这个想法最早由 SNE(随机近邻嵌入)提出。SNE 的奠基思想是:不要直接规定“谁该坐多近”,而是把亲疏关系翻译成概率——“在 A 的社交圈里,B 有多重要”用一个介于 0 和 1 之间的小数来表示。概率的好处是天然归一化,还能用信息论的尺子(KL 散度)来衡量两套概率的偏差。

但 SNE 有两个痛点:一是亲疏是单向的,A 觉得 B 重要不代表 B 觉得 A 重要,这种不对称让优化别扭;二是低维空间也用高斯分布,导致“拥挤问题”——后面我们会专门讲。t-SNE 的改进正是对症下药:对称化处理解决不对称,低维改用 Student-t 分布解决拥挤。这篇文章的全部内容,就是围绕这几个手术展开的。

所以,如果把这篇教程比作排座数学手册,目录就是:先看策划师手里的两把“亲疏尺”(高斯尺和厚尾尺),再看她手里的评价标准(KL 尴尬指数),最后看她的微调手法(梯度下降)和现场经验(调参)。

算法和 SNE 的核心追求一致:排出来的座位表,要让人觉得“策划师真的懂我们的关系”。

min⁡Y  C=min⁡Y  KL(P∥Q)\min_{Y}\; C = \min_{Y}\; \text{KL}(P \parallel Q)
这个式子说:t-SNE 的全部目标,就是找到一组低维坐标 Y,让低维亲疏概率 Q 尽量模仿高维亲疏概率 P。
  1. 低维坐标 Y每位宾客在宴会厅圆桌上的位置,是需要优化的未知数。
    Y={y1,y2,…,yn}Y = \{y_1, y_2, \ldots, y_n\}
  2. KL 散度KL(P∥Q) 读作“P 对 Q 的散度”,衡量两套概率分布之间的差异。
    KL(P∥Q)\text{KL}(P \parallel Q)
  3. 最小化不断调整座位,让这个差异值降到最低。
    min⁡Y  KL(P∥Q)\min_{Y}\; \text{KL}(P \parallel Q)

高维高斯分布:钟形曲线丈量亲疏

策划师面对的第一个问题是:怎么把“社交档案”变成一个数?她拿出一本“亲疏手册”:距离越近,亲密指数越高,而且衰减遵循一条平滑的钟形曲线——近处亲疏分明,到远处迅速归零。这就是高斯核的直觉:相似度只在局部有意义,对每个宾客来说,“朋友的朋友”已经基本不算亲密了。

在数学上,这条钟形曲线就是高斯分布。给定数据点 x_i,它把 x_j 视为近邻的条件概率定义为:先计算两点距离平方,放进以 σ_i 为带宽的高斯核里,再对所有 j 归一化。这里的 σ_i 是宾客 i 的“社交半径”——有些人社牛,社交圈很大,σ_i 就大;有些人只跟几个人熟,σ_i 就小。

pj∣i=exp⁡(−∥xi−xj∥22σi2)∑k≠iexp⁡(−∥xi−xk∥22σi2)\displaystyle p_{j|i} = \frac{\exp\left(-\frac{\lVert x_i - x_j \rVert^2}{2\sigma_i^2}\right)}{\sum_{k \neq i} \exp\left(-\frac{\lVert x_i - x_k \rVert^2}{2\sigma_i^2}\right)}

1. 距离平方:先量两位宾客在高维社交空间的欧氏距离平方,距离越远越不熟。

∥xi−xj∥2\lVert x_i - x_j \rVert^2

2. 高斯核折算:指数项把距离折算成亲密指数;距离为 0 时指数为 1,距离渐远指数快速滑向 0。

exp⁡(−∥xi−xj∥22σi2)\exp\left(-\frac{\lVert x_i - x_j \rVert^2}{2\sigma_i^2}\right)

3. 归一化分母:把 i 对所有人的亲密指数加起来,作为“社交总盘”,让每个数的占比加起来恰好是 1。

∑k≠iexp⁡(−∥xi−xk∥22σi2)\sum_{k \neq i} \exp\left(-\frac{\lVert x_i - x_k \rVert^2}{2\sigma_i^2}\right)

4. 条件概率:p_{j|i} 就是“在 i 的社交圈里,j 所占据的重视份额”。

pj∣i=亲密指数ij社交总盘ip_{j|i} = \frac{\text{亲密指数}_{ij}}{\text{社交总盘}_i}

每个 σ_i 不是随便定的,而是由困惑度(perplexity)间接控制——我们会在“流程与调参”一节细说。为了让亲疏变成双向公平的“共同亲密度”,t-SNE 还做了对称化:把 p_{j|i} 和 p_{i|j} 取平均再除以样本数 n,得到联合概率 p_ij,保证所有 p_ij 加起来等于 1,同时避免某个“万人迷”点把概率天平压歪。

pij=pj∣i+pi∣j2n\displaystyle p_{ij} = \frac{p_{j|i} + p_{i|j}}{2n}

1. 两向相加:A 对 B 的重视份额加上 B 对 A 的重视份额,兼顾两边的感受。

pj∣i+pi∣jp_{j|i} + p_{i|j}

2. 平均并归一:除以 2 是折中,再除以 n 让总概率归一,成为联合概率。

pj∣i+pi∣j2n\frac{p_{j|i} + p_{i|j}}{2n}

钟形曲线的哲学是“近亲远疏”:高斯核把注意力集中在局部邻居上,远处的关系近乎忽略。这决定了 t-SNE 天生是“看局部”的算法——它不在乎遥远宾客之间的大局关系,只在乎每个人身边的几个熟人。

低维Student-t分布:厚尾巴的宽容尺

到了宴会厅,策划师发现高维那把高斯尺不能直接用了。原因很朴素:高维空间“容积”很大,大家各占一方,互不打扰;可宴会厅只有这么点地方,如果还用“距离稍远亲密指数就断崖式下跌”的钟形尺,中等距离的宾客就会被判定为“不够亲密”,逼得所有人往中间挤,谁都坐不舒服。这时候需要一把更宽容的尺子。

这把宽容尺就是自由度为 1 的 Student-t 分布。它的特征是“厚尾”:距离变远时,亲密指数不是指数级暴跌,而是温和地按距离平方缓慢衰减。换成大白话:在宴会厅里,哪怕坐得隔了两桌,亲密度也不会掉得太难看;只要别把真正的陌生人安排在邻座就行。

qij=(1+∥yi−yj∥2)−1∑k≠l(1+∥yk−yl∥2)−1\displaystyle q_{ij} = \frac{(1 + \lVert y_i - y_j \rVert^2)^{-1}}{\sum_{k \neq l} (1 + \lVert y_k - y_l \rVert^2)^{-1}}

1. 低维距离:y_i 与 y_j 是两位宾客在圆桌上的嵌入坐标,这里算的是二维距离平方。

∥yi−yj∥2\lVert y_i - y_j \rVert^2

2. 一加一除:先加 1 让距离为 0 时权重为 1,再取倒数,使权重按 1/d² 的节奏缓慢衰减——这就是厚尾。

(1+∥yi−yj∥2)−1(1 + \lVert y_i - y_j \rVert^2)^{-1}

3. 全局分母:把所有宾客对的未归一化权重加总,作为整个宴会厅的“亲密度总盘”。

∑k≠l(1+∥yk−yl∥2)−1\sum_{k \neq l} (1 + \lVert y_k - y_l \rVert^2)^{-1}

4. 联合概率:q_ij 表示在低维座位安排下 i 和 j 实际形成的亲近比例。

qij=低维亲密权重ij低维总盘q_{ij} = \frac{\text{低维亲密权重}_{ij}}{\text{低维总盘}}

为什么偏偏选自由度为 1 的 Student-t?数学上它恰好没有多余的超参数,尾部最厚实,与“低维容积严重不足”的困境最匹配。与高斯对比:高斯在距离 2 处权重已衰减到约 1/e²≈0.14,而 Student-t 仍有 1/5=0.2,且在大距离处衰减慢得多,这让“远处的点”在优化时依然有存在感。

厚尾尺的智慧是宽容:给中等距离的宾客留出体面的远方,不逼所有人贴在一起。这一设计直接为后面的“拥挤问题”解了围。

KL散度:宴会的尴尬指数

座位初排后,策划师需要回答:“这套排法到底好不好?”她设计了一个“尴尬指数”:如果两位本该两小无猜的老友被隔开五张桌,尴尬指数简直爆表;但把八竿子打不着的两个人安排在邻座,尴尬指数只有一点点。注意这个不对称——“该近却远”远比“该远却近”更让客人难受。这就是 KL 散度的性格。

KL 散度是信息论里最常用的分布差异度量。t-SNE 把它构造为代价函数 C:遍历所有点对,用高维概率 p_ij 作为权重,计算 p_ij 与 q_ij 的对数偏差。因为 p_ij 同时充当了权重,当 p_ij 很大而 q_ij 很小时,这一项贡献巨大;反过来 p_ij 小 q_ij 大时,贡献却很小。

C=∑i∑jpijlog⁡pijqij\displaystyle C = \sum_{i} \sum_{j} p_{ij} \log \frac{p_{ij}}{q_{ij}}

1. 对数比值:p 与 q 相等时 log(1)=0,不产生尴尬;偏差越大,数值越大。

log⁡pijqij\log \frac{p_{ij}}{q_{ij}}

2. 高维权重:乘上 p_ij 后,高维里越亲近的点对,纠错话语权越大。

pijlog⁡pijqijp_{ij} \log \frac{p_{ij}}{q_{ij}}

3. 双重求和:遍历 i 和 j 的所有组合,把每对宾客的尴尬值累加成总分。

∑i∑j(⋯ )\sum_{i} \sum_{j} \left( \cdots \right)

从优化角度看,这个不对称设计是刻意的:t-SNE 宁可让普通关系显得亲密一点,也绝不允许亲密关系被拆散。这正是“局部结构优先”原则的数学化身。策划师的原则被代码化了:老朋友绝不能分开,陌生人挨着坐没关系。

梯度下降:宾客间的引力与斥力

有了尴尬指数,策划师开始微调座位。规则很直观:如果两位宾客“高维很亲、低维却坐远了”(p>q),就把他们往中间拉——这是引力;如果“高维不熟、低维却挨着”(p<q),就把他们往两边推——这是斥力。梯度下降正是这套微调动作的数学表达:朝让 C 下降最快的方向移动每个点。

对代价函数求偏导,就能得到每个低维坐标 y_i 的更新方向。t-SNE 的梯度公式有一个漂亮的物理解释:每个点 i 受到的“力”等于所有其他点 j 贡献的引力和斥力之和,力的大小正比于 (p_ij − q_ij),再乘以两点之间的方向向量和一个距离相关的缩放因子。

∂C∂yi=4∑j(pij−qij)(yi−yj)(1+∥yi−yj∥2)−1\displaystyle \frac{\partial C}{\partial y_i} = 4 \sum_{j} (p_{ij} - q_{ij})(y_i - y_j)(1 + \lVert y_i - y_j \rVert^2)^{-1}

1. 偏差符号:p_ij − q_ij 的正负决定引力还是斥力——正为拉近,负为推开。

pij−qijp_{ij} - q_{ij}

2. 方向向量:(y_i − y_j) 指向从 j 到 i 的方向,让受力有方向感。

yi−yjy_i - y_j

3. 厚尾缩放:除以 (1+d²) 是 Student-t 的尾巴在起作用,让远处点仍有小但不可忽略的影响力。

(1+∥yi−yj∥2)−1(1 + \lVert y_i - y_j \rVert^2)^{-1}

4. 求和与系数:把所有 j 的力叠加,再乘系数 4 匹配对称化后的概率尺度。

4∑j( ⋯ )4 \sum_{j} (\,\cdots\,)

实际优化中,t-SNE 用学习率控制每次挪动的步子大小,用动量(momentum)像推秋千一样积累历史方向、越过局部平坦区。迭代几百轮后,各点的受力趋于平衡,座位表就基本稳定了。策划师只需在每次挪动后重新看一眼尴尬指数,确认它在逐步下降。

拥挤问题化解:厚尾为什么能救命

为什么低维必须用厚尾尺?因为高斯尺会引发著名的拥挤问题。想象高维空间里,很多点与 x_i 的距离都差不多“中等偏上”——在高维里它们各占一方,互不影响,高斯给它们的 p 值都接近 0,无所谓。可一旦映射到二维,这些“中等距离”的点全都被挤在中心附近,因为二维圆环的面积比高维球壳小太多,放不下这么多“中等距离”的位置。

如果低维还用高斯分布,后果就是:远处的点 q_ij 几乎为 0,梯度里 (p_ij − q_ij)≈0,斥力消失,被挤在中间的点动弹不得;而该照顾的“近亲”也因为周围太拥挤而无法真正靠近——一团浆糊。这正是 SNE 当年表现不佳的根源之一。

qStudent-t∝11+d2,q高斯∝e−d2\displaystyle q^{\text{Student-t}} \propto \frac{1}{1 + d^2}, \qquad q^{\text{高斯}} \propto e^{-d^2}

1. 高斯快速崩塌:e^{-d²} 在距离稍大时就趋近于 0,远处的点“隐形”了。

e−d2→0(d 稍大)e^{-d^2} \to 0 \quad (d \text{ 稍大})

2. 厚尾缓慢下降:1/(1+d²) 在距离很大时仍保持正值,远处的点“仍有分量”。

11+d2>0(d 较大)\frac{1}{1 + d^2} > 0 \quad (d \text{ 较大})

3. 斥力保留:因为 q 不为 0,梯度中 (p−q) 的斥力项得以维持,把扎堆的点往外围铺开。

(pij−qij)<0⇒斥力持续存在(p_{ij} - q_{ij}) < 0 \Rightarrow \text{斥力持续存在}

于是厚尾分布的救场逻辑一目了然:它让“中等偏远”的距离在低维里依然能获得说得过去的 q 值,这些点不必紧贴中心也能匹配高维的“淡如水的交情”;同时远处点持续输出斥力,把人群从中心摊开到整个宴会厅,真正亲近的小团体反而获得了宽敞的空间。局部结构因此保住了。

流程与调参:策划师的实战清单

完整的 t-SNE 流程可以归纳为五步:先计算高维条件概率并对称化得到 P;再随机初始化低维坐标 Y;每轮迭代中计算低维联合概率 Q;用 KL 散度算出梯度和尴尬指数;按梯度更新 Y 并施加动量,直到收敛。整个过程就像策划师不断微调座位表,直到宾客们“各就各位”。

第一步里提到,每个点的高斯带宽 σ_i 由困惑度(perplexity)决定。困惑度量化了“每个点身边大约有多少个有效近邻”,典型取值在 5~50 之间。给定困惑度后,对每个点做二分搜索,找到使条件概率分布熵匹配的 σ_i——相当于给每位宾客定制一把合身的钟形尺。

Perp(Pi)=2H(Pi)=2−∑jpj∣ilog⁡2pj∣i\displaystyle \text{Perp}(P_i) = 2^{H(P_i)} = 2^{-\sum_j p_{j|i} \log_2 p_{j|i}}

1. 熵:条件概率 p_{j|i} 分布的熵,衡量 i 的社交圈是“广撒网”还是“深交少数”。

H(Pi)=−∑jpj∣ilog⁡2pj∣iH(P_i) = -\sum_j p_{j|i} \log_2 p_{j|i}

2. 指数化:把熵从“比特”换算成“有效邻居个数”,直觉上更友好。

Perp(Pi)=2H(Pi)\text{Perp}(P_i) = 2^{H(P_i)}

除了困惑度,实战调参还看两块:优化超参数方面,学习率通常取 100~1000,动量在前 250 轮用 0.5、之后升到 0.8,迭代次数常见 1000 轮;读数技巧方面,t-SNE 结果的簇间距离和簇大小没有绝对含义,只能看局部邻近关系——就像婚宴座位表能告诉你谁跟谁熟,但别用它推断“第 3 桌和第 7 桌的人关系最差”。多次运行取共识,才是解读 t-SNE 的正确姿势。

AI 应用场景

单细胞测序的细胞分型地图

阶段:无监督探索与数据可视化

解决的问题:单细胞 RNA 测序数据动辄数万个基因维度,直接聚类或人工标注无从下手。传统 PCA 是线性变换,面对非线性关系时会把细胞亚群搅成一团。

具体案例:免疫学家采集 3 万个小鼠脾脏细胞的基因表达谱,先用 PCA 粗筛到 50 维,再喂给 t-SNE,设置 perplexity=30。输出地图上,T 细胞、B 细胞、巨噬细胞自然分成不同色块,生物学家据此圈定罕见细胞亚群并做后续差异表达分析。

风控特征空间的异常聚类排查

阶段:特征工程与数据质量检查

解决的问题:在训练反欺诈模型前,特征工程师需要确认样本是否有隐藏的分群结构或脏数据。传统方式只能两两画散点图,高维特征下无法全局观察。

具体案例:信贷团队把 200 维用户特征降维后可视化,发现一批欺诈样本在 t-SNE 图上形成独立小簇且与正常样本完全分离;进一步检查发现该簇对应某个被攻破的渠道,模型因而及时补充了渠道特征。

大模型文本 embedding 的分布体检

阶段:模型评估与可解释性分析

解决的问题:embedding 是高维向量,评测者难以判断语义空间是否合理。用 t-SNE 把 embedding 投影到二维,可快速确认不同主题是否分簇、异常样本是否离群。

具体案例:算法团队对客服语料的 768 维 embedding 做 t-SNE 可视化,发现“退款”和“投诉”两个主题在图上严重重叠,推断原始语料标注边界模糊,据此优化了标注规范。

Python 演示

python48 行
import numpy as np  def tsne_demo(X, lr=200.0, num_iters=500, seed=0):    """Minimal t-SNE: Gaussian P + Student-t Q + KL gradient."""    n = X.shape[0]    rng = np.random.default_rng(seed)     # 1. high-dim conditional probabilities (fixed sigma, demo only)    sigma = 1.0    D = ((X[:, None, :] - X[None, :, :]) ** 2).sum(-1)    P = np.exp(-D / (2 * sigma * sigma))    np.fill_diagonal(P, 0)    P = P / P.sum()     # 2. random init of low-dim coordinates    Y = rng.normal(0, 1e-3, size=(n, 2))     for it in range(num_iters):        # 3. low-dim Student-t joint probabilities Q        DY = ((Y[:, None, :] - Y[None, :, :]) ** 2).sum(-1)        Q = 1.0 / (1.0 + DY)        np.fill_diagonal(Q, 0)        Q = Q / Q.sum()         # 4. gradient = attraction + repulsion        grad = np.zeros_like(Y)        for i in range(n):            infl = 1.0 / (1.0 + DY[i, :])  # heavy-tail scaling            diff = (P[i, :] - Q[i, :]) * infl            grad[i] = 4.0 * np.sum(diff[:, None] * (Y[i, :] - Y), axis=0)         # 5. gradient descent update (no momentum for simplicity)        Y -= lr * grad     return Y  if __name__ == "__main__":    # build 3 blobs and verify that t-SNE separates them    rng = np.random.default_rng(42)    centers = [np.array([0, 0]), np.array([3, 0]), np.array([0, 3])]    X = np.vstack([        rng.normal(loc=c, scale=0.3, size=(40, 2)) for c in centers    ])    Y = tsne_demo(X)    print("t-SNE demo done, output shape:", Y.shape)    print("first 3 rows of Y:\n", Y[:3])
目的:从零实现 t-SNE 的核心概率机制——高斯相似度、Student-t 分布、KL 梯度,帮助理解每个符号的真实作用。
  1. P = np.exp(-D / (2 * sigma * sigma))用高斯核把距离矩阵变成“亲密指数”矩阵。
  2. np.fill_diagonal(P, 0)自己跟自己的亲密度不算数,要对角线置零。
  3. Q = 1.0 / (1.0 + DY)Student-t 核:距离越大权重越小,但按 1/d² 缓慢衰减。
  4. infl = 1.0 / (1.0 + DY[i, :])梯度里的厚尾缩放因子,让远处点仍有斥力。
  5. grad[i] = 4.0 * np.sum(diff[:, None] * (Y[i, :] - Y), axis=0)累加所有其他点对 i 的引力与斥力,方向是 (Y[i]−Y[j])。
  6. Y -= lr * grad沿负梯度方向挪动低维坐标,尴尬指数下降。

常见误区

误区“既然 t-SNE 把高维数据压缩到两维,那我用这两列坐标当特征训练分类器,肯定能提升准确率。”

正解t-SNE 的坐标只服务于“两套概率分布尽量匹配”,不承诺保留距离和密度信息;且随机初始化导致每次运行坐标都不同,不具备稳定性。就像婚宴座位表只反映“谁跟谁熟”,你不能拿它推算“谁的社会地位更高”。降维特征应优先选择 PCA 或 UMAP。

为何常见:降维听起来像是“提取了主要信息”,初学者很容易把可视化输出误当成可复用的特征工程产物。

误区“perplexity 就是个调参旋钮,我设 5 和设 500 差不多,随便选一个就行。”

正解困惑度直接决定高斯带宽 σ_i,进而决定每个点眼里“谁是近邻”。设太小(如 2),只见局部噪声,全局结构碎成一地;设太大(如 500),高斯尺过宽,连远处的点都算“熟人”,局部结构被糊掉。典型范围 5~50,并且对最终可视化结构影响很大。

为何常见:许多教程把 perplexity 一句话带过,没有讲清它通过熵反解 σ_i 的机制,读者就误以为它无关紧要。

误区“KL 散度既然是算两个分布的距离,那肯定 P 对 Q 和 Q 对 P 是一样的。”

正解KL 散度天然不对称。t-SNE 用的是 KL(P∥Q),这个方向对“该近却远”罚得极重、对“该远却近”罚得很轻。如果换成 KL(Q∥P),算法会变成“宁可拆散熟人也要把陌生人分远”,得到的图完全是另一种气质。

为何常见:生活中“距离”往往是双向的,直觉会误导人;只有动手推导或看过 KL 定义的人才会注意到 log 里的分子分母不能互换。

误区“t-SNE 图上这个簇比那个簇大,说明前者数据更多;两个簇离得远,说明它们差异巨大。”

正解KL 散度只匹配局部概率结构,簇的绝对大小、簇间绝对距离都不受约束。且低维位置受厚尾分布挤压,密度被扭曲。婚宴上“第 3 桌聊得热闹”不代表“第 3 桌的人比第 8 桌更重要”。结论只能从“哪些点聚在一起”的局部关系里读。

为何常见:人脑天生会把二维图上的一切视觉特征(大小、距离、方向)赋予含义,这是认知捷径,但 t-SNE 恰好不保证这些含义成立。

面试题

Q1. t-SNE 在高维空间计算条件概率时,采用的核函数来自哪个分布?

单选题 · mid

  • A.高斯分布← 正确答案
  • B.均匀分布
  • C.泊松分布
  • D.拉普拉斯分布

答案:A。t-SNE 用高斯核把高维距离折算成条件概率,对应钟形曲线;均匀分布无法体现“近亲远疏”,泊松和拉普拉斯分布都不符合“降维保局部”的设计。就像策划师用钟形尺丈量亲疏,而不是用一把平尺。

Q2. 低维嵌入使用 Student-t 分布(自由度为 1)的主要原因是?

单选题 · easy

  • A.数学推导更简单
  • B.厚尾特性缓解拥挤问题← 正确答案
  • C.能加快数据读取速度
  • D.避免使用任何概率

答案:B。Student-t 的厚尾让“中等偏远”的点在低维中仍有可观的 q 值,既保住远处点的斥力,又不必让它们挤到中心,从而缓解拥挤问题。它并不让推导更简单、与数据读取无关,而且 t-SNE 恰恰处处用概率。

Q3. 关于 KL 散度作为 t-SNE 目标函数,以下说法正确的有?

多选题 · mid

  • A.它是完全对称的分布差异度量
  • B.它对“该近却远”惩罚更重← 正确答案
  • C.它是非对称的差异度量← 正确答案
  • D.它对“该远却近”惩罚更重

答案:BC。KL(P∥Q) 不对称,且因为 p_ij 同时充当权重,当高维近、低维远(p 大 q 小)时惩罚极大;反过来惩罚很小。所以局部结构优先——老朋友绝不能分开,陌生人挨着坐没关系,这也解释了选项 A、D 的错误。

Q4. t-SNE 梯度中 (p_ij − q_ij) 的符号决定什么?

单选题 · easy

  • A.大于零是引力,小于零是斥力← 正确答案
  • B.大于零是斥力,小于零是引力
  • C.正负都产生相同方向的力
  • D.符号只影响大小不影响方向

答案:A。p>q 表示“高维很亲、低维太远”,需要拉近,即引力;p<q 表示“高维不熟、低维太近”,需要推开,即斥力。符号决定了座位移动的方向,这正是梯度公式中 (y_i − y_j) 方向向量的意义所在。

Q5. 关于 t-SNE 的拥挤问题,下列描述正确的是?

单选题 · hard

  • A.高维空间样本数量过多导致内存溢出
  • B.低维容量有限导致中等距离点扎堆← 正确答案
  • C.梯度下降轮数太多导致过拟合
  • D.高斯核参数太大导致计算爆炸

答案:B。高维球壳“容积”远大于二维圆环,高维里大量中等距离的点在二维没有足够位置安放,若低维使用高斯分布,这些点只能往中心挤,形成拥挤问题。其余选项把拥挤误认为算力、过拟合等无关问题。

Q6. 使用 Student-t 分布替代高斯分布作为低维核,其数学效果包括哪些?

多选题 · extreme

  • A.让中等距离点对的 q 值不至于衰减过快← 正确答案
  • B.使低维概率分布拥有更厚的尾部← 正确答案
  • C.让高维条件概率同时变得更厚尾
  • D.梯度中远处的点仍能产生一定斥力← 正确答案

答案:ABD。Student-t 的 q ∝ 1/(1+d²),尾部比 e^{−d²} 厚得多,因此中等距离的 q 值衰减慢,远处点对的梯度斥力也不会归零,能把人群铺开。它只改低维核,不改变高维的高斯条件概率,故 C 错误。

Q7. t-SNE 主要解决哪类机器学习的任务?

单选题 · easy

  • A.高维数据降维与可视化← 正确答案
  • B.线性回归预测任务
  • C.图像分类识别
  • D.文本自动生成

答案:A。t-SNE 是无监督降维算法,专长是把高维数据映射到二维或三维供人眼观察。回归、分类、生成都是它不直接承担的任务;不过它的输出可视化常辅助这些任务的探索阶段。

Q8. 对称化处理中,联合概率 p_ij 的正确计算方式是?

单选题 · mid

  • A.直接等于一个方向的条件概率
  • B.取双向条件概率均值再除以 n← 正确答案
  • C.取双向条件概率的乘积
  • D.取两个条件概率中的较大值

答案:B。对称化把单向重视变成双向亲疏:(p_{j|i}+p_{i|j})/(2n) 既折中了两人的“互评”,又通过除以 n 让所有 p_ij 之和为 1,成为规范的联合概率。直接取一个方向、取乘积或取最大都会破坏对称性和归一化。

Q9. 困惑度(perplexity)在 t-SNE 中的作用是?

单选题 · mid

  • A.直接控制低维点数量
  • B.间接决定高斯带宽大小← 正确答案
  • C.决定迭代的总轮数
  • D.控制学习率的大小

答案:B。perplexity 通过二分搜索反解每个点的高斯带宽 σ_i,把“有效邻居数”翻译成钟形尺的胖瘦。它不控制点数、迭代轮数或学习率,所以其余选项都是张冠李戴。

Q10. 关于 t-SNE 的优化过程,以下说法正确的有?

多选题 · hard

  • A.低维坐标通常随机初始化← 正确答案
  • B.动量项有助于加快收敛← 正确答案
  • C.目标函数是凸函数可全局最优
  • D.梯度由引力与斥力叠加而成← 正确答案

答案:ABD。t-SNE 采用随机初始化,并用动量在起伏的损失面上加速越过平坦区;梯度中 (p−q) 的符号天然把作用力分成引力和斥力。但 KL 散度对 Y 非凸,不同初始化会得到不同结果,故 C 错误;也正因如此,多次运行取共识是实战要领。