社区文化节要开张了。几百户家庭涌进广场,你作为热心的志愿者,要在两米见方的小桌上把大家安排好——让兴趣相投的人坐在一起,让话不投机的人离远些。可每家都有几十上百个维度的特征:爱读书、爱烘焙、爱编程、爱养猫……你不可能翻完每张问卷,却渴望一眼看出“谁跟谁聊得来”。t-SNE 就是这位神通广大的“排座位志愿者”:它把词向量在高维空间里的邻里关系,翻译成一张人人能看懂的二维散点图。本文将带你从算法原理、参数调优到实践技巧,像排座位一样,把词嵌入的语义结构看得明明白白。

岗位关联

掌握 t-SNE 可视化,就像给词嵌入装上一双“透视眼”——你不仅能看到语义簇的分布,还能快速定位模型训练中的异常,这是 NLP 工程师做词嵌入分析和模型调试的核心技能。

目录
  1. 可视化演示
  2. 算法核心原理
  3. 词嵌入语义聚类
  4. 参数调优技巧
  5. 数据预处理
  6. 可视化分析方法
  7. 实战工程经验
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示t-SNE将高维词向量降维到2D的聚类过程,以及不同perplexity参数对可视化结果的影响。

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

t-SNE降维聚类过程 高维词向量通过t-SNE映射到2D平面 KL散度最小化使相似词聚集形成簇 迭代过程中点从随机位置收敛到聚类位置 KL(P||Q) = Σ p_ij log(p_ij/q_ij) t分布缓解拥挤问题保留局部结构。

算法核心原理

你排座位的第一件事,不是急着搬椅子,而是先摸清每户人家跟谁熟。你会观察他们在兴趣维度上的“坐标”:爱读书的工程师和爱烘焙的会计,在“阅读”维度上或有交集,但和整天钓鱼的邻居就没什么话聊。坐标距离近的家庭,天然更容易聊到一块儿——这就是高维空间中的“亲疏关系”。

词嵌入正是把这种关系数字化了。Word2Vec、GloVe 等模型把每个词映射成几百维的实数向量,语义相近的词在高维空间中相互靠近。可三百维的空间我们画不出来,必须压缩到二维平面。t-SNE 的做法是:先为每个点 \(x_i\) 计算它与其余所有点的“亲密度”,用一个条件概率分布来表达——距离越近,概率越高。

有了高维空间的亲密度分布,t-SNE 还会在二维平面构造另一个分布,并用 KL 散度不断缩小两者的差距。整个过程就像你一次次微调座位:每调整一次,就瞄一眼“现实中关系近的是否真的坐到了一起”。最终收敛时,你就得到了一张忠实反映高维邻里关系的二维座位图。

pj∣i=exp⁡(−∥xi−xj∥2/2σi2)∑k≠iexp⁡(−∥xi−xk∥2/2σi2)\displaystyle p_{j|i} = \frac{\exp(-\lVert x_i - x_j \rVert^2 / 2\sigma_i^2)}{\sum_{k \neq i} \exp(-\lVert x_i - x_k \rVert^2 / 2\sigma_i^2)}
这个公式回答的是“以词 i 为中心,词 j 是它近邻的概率有多大”,是 t-SNE 一切排座工作的起点。
  1. 指数分子计算两个词在原始高维空间的距离,距离越近,指数越大,亲密度越高。
    exp⁡(−∥xi−xj∥2/2σi2)\exp(-\lVert x_i - x_j \rVert^2 / 2\sigma_i^2)
  2. 归一化分母把所有邻居的指数值累加起来作为缩放基准,让所有概率之和等于 1。
    ∑k≠iexp⁡(−∥xi−xk∥2/2σi2)\sum_{k \neq i} \exp(-\lVert x_i - x_k \rVert^2 / 2\sigma_i^2)
  3. 带宽缩放\(\sigma_i\) 控制词 i 的“视野半径”——值越大,它能看到的邻居越多,分布越平滑。
    2σi22\sigma_i^2

词嵌入语义聚类

座位图排好之后,有趣的现象出现了:爱读书的聚在了一角,烘焙爱好者自发围成一圈,程序员们干脆在另一头开了现场技术沙龙。你并没有刻意分组,只是按亲密度排座,兴趣小组就“长”了出来——这就是聚类的力量。

词嵌入的 t-SNE 图同样呈现出“物以类聚”。动物词挤在一起,水果词形成一簇,交通工具词分布在另一侧。要衡量两个词在嵌入空间中的语义相似度,最常用的指标是余弦相似度,它只看两个向量的方向是否一致:

在 t-SNE 图上,你可以快速圈出一个个簇:把余弦相似度高的词标成同色,观察它们是否落在同一片区域。如果“苹果”“香蕉”“橙子”紧挨着,说明嵌入模型确实学到了水果这一语义概念。还能观察到更有趣的规律:名词、动词、形容词往往形成各自的聚集区;某些词对如“国王—王后”“男人—女人”在图上保持平行的偏移方向,隐隐勾勒出类比关系的轮廓。若该聚的没聚在一起,就要警惕训练数据或参数出了问题。

cos⁡(A⃗,B⃗)=A⃗⋅B⃗∥A∥×∥B∥\displaystyle \cos(\vec{A}, \vec{B}) = \frac{\vec{A} \cdot \vec{B}}{\lVert A \rVert \times \lVert B \rVert}
余弦相似度消除了向量长度的影响,因此能避免高频词因“模长更大”而干扰语义比较。
  1. 向量点积把两个向量的每一维相乘再求和,方向越一致,乘积越大。
    A⃗⋅B⃗=∑d=1DAd×Bd\vec{A} \cdot \vec{B} = \sum_{d=1}^{D} A_d \times B_d
  2. 模长乘积用各自长度相乘作为分母,把向量长度的影响剔除掉。
    ∥A∥×∥B∥\lVert A \rVert \times \lVert B \rVert
  3. 归一化比值余弦值落在 [-1, 1],越接近 1 表示语义越接近,越接近 -1 表示越对立。
    cos⁡(A⃗,B⃗)=A⃗⋅B⃗∥A∥×∥B∥\cos(\vec{A}, \vec{B}) = \frac{\vec{A} \cdot \vec{B}}{\lVert A \rVert \times \lVert B \rVert}

参数调优技巧

排座位时你发现:如果把“交朋友圈子”设得太小,每个人只认识身边两三个人,整张桌子会像打碎的拼图;设得太大,又人人都和所有人说得上话,座位图糊成一团。这个“圈子大小”在 t-SNE 里就是困惑度(perplexity)。

困惑度本质上是“每个点的有效邻居数”。它决定一个点在多大范围内寻找近邻——困惑度小,局部结构被放大;困惑度大,全局结构更明显。数学上,困惑度是对条件概率分布的信息熵做指数变换:

实际调参时,困惑度一般取 5~50,且必须小于样本数。词嵌入可视化的常见做法是从 5、10、15、30 逐个试,选结构最稳定的那张图。学习率则控制每次迭代移动的步幅——太大,点会在桌面上“弹来弹去”;太小,又半天挪不动。建议先用默认值 200,观察迭代曲线不降再调整到 100 或 500。迭代次数看收敛情况而定,通常几百轮足够。随机种子千万别忘固定——t-SNE 每次初始化不同,固定种子才能让结果可复现。

Perp(Pi)=2−∑jpj∣ilog⁡2pj∣i\displaystyle \text{Perp}(P_i) = 2^{-\sum_j p_{j|i} \log_2 p_{j|i}}
困惑度可以通俗理解为“以点 i 为中心,它真正在乎的邻居大概有几个”。
  1. 熵计算对条件概率分布取对数并加权求和,得到该分布的混乱程度。
    −∑jpj∣ilog⁡2pj∣i-\sum_j p_{j|i} \log_2 p_{j|i}
  2. 指数还原以 2 为底做幂运算,把熵值映射回“有效邻居数”。
    2−∑jpj∣ilog⁡2pj∣i2^{-\sum_j p_{j|i} \log_2 p_{j|i}}

数据预处理

表格上有些家庭信息是“脏”的:有人只填了一个兴趣,有人填了五十个;还有个别家庭走错了场地。如果直接拿这些数据排座位,结果必然一塌糊涂。词向量预处理也是同理,先做好清洗再喂给 t-SNE 至关重要。

第一件事是词频过滤:只出现过一两次的低频词,向量往往不稳定,可视化时容易成为“幽灵离群点”。第二件事是向量标准化:每个词向量分别减去均值、除以标准差,让所有维度处在同一尺度,避免某些维度过大主导相似度计算:

另一个实战利器是 PCA 预降维。当原始词向量是 300 维甚至更高时,先用 PCA 压缩到 50 维左右,能显著加快 t-SNE 迭代,且通常保留绝大部分结构信息。如果词表太大,还可以对高频词做等距采样——就像志愿者优先安排年年来参加的大户人家,一年只露一次面的邻居稍后再请进来。

zi=xi−μσ\displaystyle z_i = \frac{x_i - \mu}{\sigma}
标准化让每个维度从“绝对量”变成“相对偏移量”,用统一的尺度衡量不同特征的重要性。
  1. 数据中心化先减去均值 \(\mu\),让数据围绕 0 对称,正负偏移才可比。
    xi−μx_i - \mu
  2. 尺度归一化再除以标准差 \(\sigma\),把不同量纲的特征压到同一量级,防止个别维度“一言堂”。
    xi−μσ\frac{x_i - \mu}{\sigma}

可视化分析方法

座位图终于摆在社区主任面前。主任不关心你调了几轮参数,他只看三件事:谁跟谁坐在一起?有没有人落单?整个社区分成了几个圈子?这正是 t-SNE 可视化分析的三个角度:聚类效果、离群点、全局布局。

聚得紧不紧、分得开不开,可以用一个简单的分离度指标量化。某个簇的内部越紧凑、离全局中心越远,说明这个簇越“独立”:

落在两簇之间、甚至孤悬图外的点,往往非常有意思:它们可能是语义模糊的多义词,也可能是训练数据混入的噪声,还可能是撞上随机种子的“偶然离群”。顺着这些点去查训练语料,经常能发现清洗阶段的遗漏。整张图的簇数、簇间边界、渐变走向,还能帮你判断模型是否学到了平滑的语义空间——当“热→暖→温→凉→冷”在图中连成一条渐变带时,说明词嵌入质量相当可靠,就像主任看到老中青三代都能找到聊得来的圈子,明白这场文化节办得值。

sk=∥μk−μ∥1nk∑i∈Ck∥xi−μk∥\displaystyle s_k = \frac{\lVert \mu_k - \mu \rVert}{\frac{1}{n_k} \sum_{i \in C_k} \lVert x_i - \mu_k \rVert}
分离度越大,代表该簇与周围簇划开的界限越清晰,聚类质量越高。
  1. 簇内紧密度先求簇内所有点到质心的平均距离,越小表示簇内词越抱团。
    1nk∑i∈Ck∥xi−μk∥\frac{1}{n_k} \sum_{i \in C_k} \lVert x_i - \mu_k \rVert
  2. 簇间分离度再求质心到全局中心的距离,越大表示该簇离其他簇越远。
    ∥μk−μ∥\lVert \mu_k - \mu \rVert
  3. 分离度比值两者相除,得到簇的独立程度,值越大聚类越清晰。
    sk=∥μk−μ∥1nk∑i∈Ck∥xi−μk∥s_k = \frac{\lVert \mu_k - \mu \rVert}{\frac{1}{n_k} \sum_{i \in C_k} \lVert x_i - \mu_k \rVert}

实战工程经验

社区越大,排座位的活儿越难。当词表从几千涨到几百万,t-SNE 的两两距离计算让人崩溃——因为要算 \(n^2\) 个点对。好在有 Barnes-Hut 近似算法,它把远处一窝蜂的点用一个“质心”代替,把复杂度从 \(O(n^2)\) 降到大约 \(O(n \log n)\),让百万级词表的可视化成为可能。

大规模可视化的标准流水线是:先采样(通常取 5 万~10 万最常用词),再 PCA 预降维到 50 维,然后用 Barnes-Hut 版 t-SNE(sklearn 的 method='barnes_hut')迭代几百轮。每一步,梯度更新都遵循下面的公式,每个点按概率残差和位置差一步步滑动:

工程上还要注意三点:第一,别做一次可视化就下结论,多换几个随机种子跑几轮,只相信反复出现的结构;第二,色彩方案要克制,用同一色系的深浅表示强度,而不是把所有颜色堆上去;第三,结果验证要有对照——拿一组已知语义关系的词对(如“苹果-香蕉”“汽车-火车”),确认它们在图上确实相邻,这张图才可信。

∂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\) 与低维概率 \(q\) 的差值,差得越多,点移动的驱动力越大。
    (pij−qij)(p_{ij} - q_{ij})
  2. 位置偏移项用两点在当前平面上的坐标差决定移动方向,保持相对位置关系。
    (yi−yj)(y_i - y_j)
  3. 权重衰减项距离越远权重越小,防止远距离的点互相“推搡”过头。
    (1+∥yi−yj∥2)−1(1 + \lVert y_i - y_j \rVert^2)^{-1}

AI 应用场景

词嵌入质量检测(模型调试)

阶段:模型评估与调试

解决的问题:训练完 Word2Vec 后,只靠困惑度等标量指标很难判断词向量是否学到了语义结构。传统做法是随机抽词做近邻搜索,效率低且覆盖面小。用 t-SNE 把所有词画成一张图,几秒钟就能观察是否形成清晰语义簇,还能直观定位异常词。

具体案例:某电商团队训练商品标题词向量后,用 t-SNE 画图发现“苹果”同时落在水果簇和数码簇附近——这不是 bug,而是多义词的合理映射。团队因此决定为“苹果(水果)”和“苹果(手机)”分别建立词条,检索准确率提升了 8%。

语义词典构建(知识挖掘)

阶段:数据标注与知识准备

解决的问题:搭建垂直领域问答系统时,需要一份领域词表。人工整理耗时且易遗漏,从 t-SNE 聚类簇中直接挖掘语义相关词,效率可提升数倍。

具体案例:医疗 NLP 团队用 t-SNE 对医学词嵌入做可视化,观察到“头孢”“阿莫西林”“青霉素”在图中紧邻,并与“过敏”呈现渐变式过渡——这帮助他们快速构建了药品-不良反应语义库,省去了两周人工整理时间。

检索召回扩充(搜索推荐)

阶段:召回与特征工程

解决的问题:搜索系统召回阶段依赖字面匹配,容易漏掉语义相近但用词不同的 query。通过 t-SNE 聚类结果定位“语义近邻簇”,再在簇内提取可替换词,能有效提升召回率。

具体案例:某招聘平台发现用户搜“程序员”时,传统召回只匹配到含“程序员”的职位。t-SNE 可视化显示“程序员”“工程师”“开发”聚在同一簇,于是把这三个词加入同义扩展表,岗位点击率提升了 12%。

Python 演示

python47 行
import numpy as npfrom sklearn.manifold import TSNEimport matplotlib.pyplot as plt # 1. 构造模拟词向量: 3组语义簇, 每组5个词, 维度50words = ['apple', 'banana', 'orange', 'strawberry', 'watermelon',         'cat', 'dog', 'rabbit', 'tiger', 'elephant',         'car', 'train', 'plane', 'ship', 'subway']np.random.seed(42)dim = 50vectors = np.random.randn(len(words), dim) # 给每组词叠加不同的偏置向量, 模拟语义接近offsets = {    'fruit': np.array([2.0, 0, 0, 0, 0] + [0] * (dim - 5)),    'animal': np.array([0, 2.0, 0, 0, 0] + [0] * (dim - 5)),    'vehicle': np.array([0, 0, 2.0, 0, 0] + [0] * (dim - 5)),}for i in range(15):    if i < 5:        vectors[i] += offsets['fruit']    elif i < 10:        vectors[i] += offsets['animal']    else:        vectors[i] += offsets['vehicle'] # 2. 标准化: 每个向量减均值, 除以标准差vectors = (vectors - vectors.mean(axis=0)) / vectors.std(axis=0) # 3. 执行 t-SNE 降维tsne = TSNE(n_components=2, perplexity=4, learning_rate=200, max_iter=500, random_state=42)embedded = tsne.fit_transform(vectors) # 4. 绘制散点图colors = ['#818CF8'] * 5 + ['#10B981'] * 5 + ['#F43F5E'] * 5plt.figure(figsize=(8, 6))plt.scatter(embedded[:, 0], embedded[:, 1], c=colors, s=140)for i, w in enumerate(words):    plt.annotate(w, xy=(embedded[i, 0], embedded[i, 1]),                 fontsize=12, xytext=(4, 4),                 textcoords='offset points')plt.title('Word Embedding t-SNE')plt.tight_layout()plt.show() print('原始维度:', vectors.shape[1], '-> 2维')print(embedded[:3])
目的:模拟一组带语义分组关系的词向量,展示从标准化、t-SNE 降维到散点图绘制的完整流程。
  1. np.random.seed(42)固定随机种子,保证每次运行结果一致。
  2. vectors = np.random.randn(len(words), dim)随机初始化 15 个词的 50 维向量,模拟原始词嵌入。
  3. vectors = (vectors - vectors.mean(axis=0)) / vectors.std(axis=0)做标准化,让每个维度尺度一致,对应正文中的预处理步骤。
  4. tsne = TSNE(n_components=2, perplexity=4, learning_rate=200, max_iter=500, random_state=42)创建 t-SNE 模型,样本只有 15 个,困惑度取 4。
  5. embedded = tsne.fit_transform(vectors)执行降维,返回 15 个二维坐标。
  6. plt.scatter(embedded[:, 0], embedded[:, 1], c=colors, s=140)用三种颜色绘制三个语义簇,观察聚类效果。

常见误区

误区我在 t-SNE 图上看到“汽车”和“卡车”几乎重叠,说明它们的向量几乎一样,所有靠近的点都应该是强语义相关。

正解t-SNE 的 KL 散度优化只保证局部结构尽量保留,全局距离会被压缩甚至扭曲。两簇之间的空白大小不代表真实语义距离,簇的绝对位置也没有意义。判断语义相近还要回到原始向量上算余弦相似度,图只能作为线索,不能当证据。

为何常见:二维图太直观了,人眼天然相信“离得近 = 有关系”,但 t-SNE 的目标是让局部邻居关系可信,并不承诺全局距离真实。

误区困惑度设大一点,能看到更多全局结构,我试了 100、200,结果图看起来更“整”,所以应该取越大越好。

正解困惑度太大(接近样本数)时,每个点的邻居范围过广,局部结构被抹平;太小(如 2、3)又只看到零星碎片。经验法则是从 5~50 区间内根据样本量网格搜索,并对比多个困惑度下都稳定的结构。

为何常见:新手常把“全局信息”误解为“更重要信息”,忽视了 t-SNE 的核心价值恰恰在局部结构。

误区我跑了两遍 t-SNE,图完全不一样,是不是代码写错了?或者模型训练有问题?

正解t-SNE 使用随机初始化,两次运行产生不同布局是正常现象。关键要看簇的结构是否稳定:换种子后,同样的词簇是否还是聚在一起。正式实验要固定 random_state,并在报告里声明种子值。

为何常见:刚接触降维的同学习惯了 PCA 的确定性输出,遇到随机算法天然觉得可疑,其实随机性正是 t-SNE 搜索全局结构的机制之一。

误区既然 t-SNE 能把 300 维降到 2 维,那我把训练数据降维后直接喂给分类器,不是又快又好?

正解t-SNE 是可视化工具,不是特征工程工具。它只保留近邻关系,丢弃全局距离信息,且新样本无法直接映射到已有平面。若需要降维建模,应选用 PCA、UMAP 或自编码器。

为何常见:t-SNE 和 PCA 都叫“降维”,初学者容易混淆用途;加上可视化效果好,误以为信息损失不大。

面试题

Q1. t-SNE 算法最主要的作用是什么?

单选题 · easy

  • A.对高维数据进行降维可视化← 正确答案
  • B.对文本进行情感分类
  • C.对词向量做聚类预测
  • D.对模型做参数自动优化

答案:A。t-SNE 的核心目标是把高维数据降维并可视化,让局部近邻关系在二维平面重现。B 是分类任务,C 是聚类任务,D 是超参优化,均非 t-SNE 主要职责。

Q2. t-SNE 降维后通常保留几个维度用于可视化?

单选题 · easy

  • A.保留原始特征的全部维度
  • B.降到二维或三维用于查看← 正确答案
  • C.降到与样本数相同的维度
  • D.保留方差最大的五十个维度

答案:B。t-SNE 的设计目标就是输出人眼可读的二维或三维坐标。保留全部维度等于没降维,降到样本数或五十维都无法直接可视化,因此 B 正确。

Q3. 关于 t-SNE 的困惑度,下列说法正确的是?

单选题 · mid

  • A.困惑度越小则聚类必然越分散
  • B.困惑度控制局部与全局信息权衡← 正确答案
  • C.困惑度通常设置大于样本数量
  • D.困惑度数值必须等于嵌入维度数

答案:B。困惑度近似“有效邻居数”,决定每个点感知多少邻居,从而在局部与全局结构间权衡。它应小于样本数,且与嵌入维度无关,A、C、D 均错误,B 正确。

Q4. t-SNE 算法优化的目标函数是什么?

单选题 · mid

  • A.最小化均方误差损失
  • B.最小化余弦距离损失
  • C.最小化 KL 散度← 正确答案
  • D.最小化交叉熵损失

答案:C。t-SNE 用 KL 散度衡量高维概率分布 p 与低维概率分布 q 的差异,并迭代最小化它。均方误差是回归损失,余弦距离是度量指标,交叉熵常见于分类,均不是 t-SNE 的目标。

Q5. 大规模词表做 t-SNE 前,为什么常用 PCA 预降维?

单选题 · mid

  • A.PCA 能消除词向量的稀疏性
  • B.PCA 加速并稳定 t-SNE 收敛← 正确答案
  • C.PCA 把词映射到语义空间
  • D.PCA 完全替代 t-SNE 的工作

答案:B。300 维以上直接跑 t-SNE 因距离计算量大而速度慢,先用 PCA 降到 50 维可显著加速且基本保留结构。PCA 不针对稀疏性,也不能完成非线性映射,A、C、D 均错。

Q6. 哪些因素会导致两次 t-SNE 运行结果差异明显?

多选题 · hard

  • A.随机种子初始化不同← 正确答案
  • B.使用完全相同的困惑度
  • C.迭代次数设置不一致← 正确答案
  • D.学习率取不同的数值← 正确答案

答案:ACD。t-SNE 随机初始化、迭代次数和学习率都直接影响最终布局;相同困惑度是恒定条件,不会导致运行差异。要复现结果,应固定随机种子并统一超参数。

Q7. 观察词嵌入 t-SNE 图时,语义相近的词通常表现为?

单选题 · easy

  • A.在图中位置彼此靠近← 正确答案
  • B.在图中颜色保持相同
  • C.在图中均匀分布错落
  • D.在图中朝向同一方向

答案:A。t-SNE 保留高维近邻关系,语义相近的词在原始空间距离近,降维后同样聚在一起。颜色由人工指定,方向不是 t-SNE 的输出属性,B、C、D 均不符合。

Q8. 关于 t-SNE 可视化的局限性,下列说法正确的有?

多选题 · hard

  • A.全局距离无法准确解读← 正确答案
  • B.簇与簇之间的间距有绝对值意义
  • C.簇的大小不一定代表样本真实规模← 正确答案
  • D.不同随机种子结果会有差异← 正确答案

答案:ACD。t-SNE 只保局部结构,全局间距和簇的绝对大小都可能被扭曲,因此 A、C 正确,B 错误;随机初始化导致每次运行不同,D 也正确。

Q9. t-SNE 学习率设置过大会导致什么后果?

单选题 · mid

  • A.低维映射过度压缩变形
  • B.低维映射发散不稳定← 正确答案
  • C.低维映射收敛速度变慢
  • D.低维映射结果不受影响

答案:B。学习率决定每轮迭代的移动步长。步长过大,点会在目标位置附近震荡甚至发散;过小则收敛缓慢。学习率不直接引发压缩变形,因此 B 正确。

Q10. Barnes-Hut 近似优化 t-SNE 的核心思想是什么?

单选题 · single

  • A.用远处点的质心近似整体作用力← 正确答案
  • B.用随机采样替代全部点对计算
  • C.将数据切块并行加速处理
  • D.降低高维距离计算精度换速度

答案:A。Barnes-Hut 在迭代时构建四叉树,远处一簇点用它们的质心整体近似,将复杂度从 O(n²) 降到 O(n log n)。它不是随机采样、并行计算或降低精度,故 A 正确。