2

我想将我使用 scikit-learn 的 TfidfVectorizer 的文本文档的相似性可视化为tfidf = TfidfVectorizer(decode_error='ignore', max_df=3).fit_transform(data)

然后执行余弦相似度计算为cosine_similarity = (tfidf*tfidf.T).toarray()

这给出了相似性,但sklearn.manifold.MDS需要一个相异矩阵。当我给出 1-cosine_similarity 时,应该为零的对角线值不为零。它们是一些小的价值,例如1.12e-9等。两个问题:

1) 如何使用 MDS 的相似度矩阵或如何将相似度矩阵更改为不相似度矩阵?

2) 在 MDS 中,有一个选项dissimilarity,其值可以是'precomputed''euclidean'。两者有什么区别,因为当我给出欧几里得时,无论我使用 cosine_similarity 还是 1-cosine_similarity ,MDS 坐标都会变得相同,这看起来是错误的。

谢谢!

4

1 回答 1

2

我不太了解您的余弦变换(因为我没有看到涉及余弦/角度/归一化标量积)并且我不知道 TfidfVectorizer 功能,但我会尝试回答您的两个问题:

1) 通常 (dissimilarity = 1-similarity)- 方法适用于矩阵中所有条目都在 -1 和 1 之间的情况。假设距离矩阵 d = cosine_similarity 是一个直到数值伪影的对称距离矩阵你可以申请

dissimilarity_clean = 1 - np.triu(d)+np.triu(d).T-np.diag(np.ones(len(d)))

纠正伪影。当使用 numpys corrcoef(X) 创建基于 Pearson 相关系数的相异矩阵时,可能需要相同的操作。两侧节点: 1. 对于无界相似性度量,您仍然可以提出等效方法。2. 在使用 MDS 的情况下,您可能会考虑使用更接近欧几里德距离(且无界)的度量,因为这将是 MDS 的更自然选择并导致更好的结果。

2) 使用“预计算”选项假定您为 MDS 的 .fit(X=dissimilarity matrix) 方法提供了您预先计算的相异矩阵(您的场景)。相反,使用 dissimilarity = 'euclidean' 将计算您传递给 .fit(X=data) 的数据的欧几里得距离矩阵。

希望这可以帮助!

于 2017-05-09T14:29:01.893 回答