2014-12-06 126 views
2

我希望显示的文本文档的相似性我使用这scikit学习的TfidfVectorizer为tfidf = TfidfVectorizer(decode_error='ignore', max_df=3).fit_transform(data)使用相似矩阵,而不是在相似矩阵为MDS scikit学习

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

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

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

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

谢谢!

回答

1

我真的不明白你的余弦变换(因为我知道没有余弦/角度参与),我不知道TfidfVectorizer功能,但我会尽量回答你的两个问题:

1)一般的(异性= 1相似)-approach是有效的,其中在矩阵中的所有的条目是在-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)的数据的欧氏距离矩阵。

希望这会有所帮助!