You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两种基于余弦相似度的t-SNE绘图结果差异原因咨询

文章相似度t-SNE可视化结果异常问题

问题背景

我开展文章相似度分析工作的目标是识别内容相似的文章簇,采用的技术路线为:计算文章TF-IDF向量间的余弦相似度,再通过t-SNE降维绘制可视化图。
我尝试了两种逻辑看似一致的实现方式,在固定random_state=1的前提下得到的可视化结果差异极大,无法判断哪种实现是正确的。示例中tfdoc为文章对应的TF-IDF矩阵。

第一种实现

from sklearn.metrics.pairwise import cosine_similarity
from sklearn import manifold

X = cosine_similarity(tfdoc, tfdoc)
model = manifold.TSNE(random_state=1, metric="precomputed")
Y = model.fit_transform(X) 

对应可视化结果:
第一种实现输出可视化图

第二种实现

from sklearn.manifold import TSNE

tsne = TSNE(random_state=1, metric="cosine")
embs = tsne.fit_transform(tfdoc)

对应可视化结果:
第二种实现输出可视化图
待解决疑问:两种实现方式的本质差异是什么,哪种方式的输出结果是正确的。

解答

两种结果差异极大的核心原因是第一种实现的输入不符合t-SNE的参数要求:

  • 当t-SNE设置metric="precomputed"参数时,要求输入的必须是距离矩阵:矩阵中数值越大,代表两个样本的距离越远、相似性越低。但第一种实现传入的是cosine_similarity输出的余弦相似度矩阵,这类矩阵数值越大代表样本越相似,和预计算模式的输入要求完全相反,相当于颠倒了样本间的亲疏关系,输出结果不具备参考性。
  • 第二种实现直接传入原始TF-IDF矩阵,指定metric="cosine",让t-SNE在算法内部自动计算样本间的余弦距离,完全符合算法输入逻辑,输出结果是正确的。

如果需要使用预计算距离的写法,只需要将余弦相似度替换为余弦距离计算即可,修正后的代码输出结果和第二种实现的聚类分布一致,仅可能存在可忽略的浮点精度误差:

from sklearn.metrics.pairwise import cosine_distances
from sklearn import manifold

# 预计算模式下必须传入距离矩阵,而非相似度矩阵
X = cosine_distances(tfdoc, tfdoc)
model = manifold.TSNE(random_state=1, metric="precomputed")
Y = model.fit_transform(X) 

内容的提问来源于stack exchange,提问作者HenkieTee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:21:32