python - 在 scikit-learn 中使用相似矩阵代替 MDS 的相异矩阵

标签 python numpy matrix scikit-learn multi-dimensional-scaling

我想可视化使用 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,其值可以是'precompulated''euclidean'。两者之间有什么区别,因为当我给出欧几里德时,无论我使用 cosine_similarity 还是 1-cosine_similarity,MDS 坐标都会相同,这看起来是错误的。

谢谢!

最佳答案

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

1) 一般来说,(相异度 = 1-相似度) 方法对于矩阵中所有条目都在 -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 = 'euclidean' 会计算传递给 .fit(X=data) 的数据的欧几里德距离矩阵。

希望这有帮助!

关于python - 在 scikit-learn 中使用相似矩阵代替 MDS 的相异矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27337610/

相关文章:

python - python2中的types.MethodType第三个参数

python - round() 函数不适用于 databricks-Python

python - 用 beautifulsoup 进行现场抓取

python - 从 numpy loadtxt() 获取日期列

c++ - 使用 xptr 在内存中存储和检索矩阵

python - 获取从串行到输出到 TexCtrl 的持续更新

python - 根据 pandas 数据框中特定列中的值提取列值

python - numpy reshape 如何工作?

java - 关于方阵转置的问题

python - 查找矩阵大对角线下方的所有元素