两种基于余弦相似度的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
相关产品推荐
相关产品推荐

