sklearn.manifold 中的余弦相似度 TSNE

Posted

技术标签:

【中文标题】sklearn.manifold 中的余弦相似度 TSNE【英文标题】:Cosine similarity TSNE in sklearn.manifold 【发布时间】:2016-08-01 10:08:41 【问题描述】:

我在使用余弦相似度对我的数据集执行 TSNE 时遇到了一个小问题。

我已经计算了我所有向量的余弦相似度,所以我有一个包含余弦相似度的方阵:

A = [[  1    0.7   0.5   0.6  ]
     [  0.7   1    0.3   0.4  ]
     [  0.5  0.3    1    0.1  ]
     [  0.6  0.4   0.1    1   ]]

然后,我正在使用这样的 TSNE:

A = np.matrix([[1, 0.7,0.5,0.6],[0.7,1,0.3,0.4],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]])
model = manifold.TSNE(metric="precomputed")
Y = model.fit_transform(A) 

但我不确定使用预先计算的度量是否能保持我的余弦相似度:

#[documentation][1]
If metric is “precomputed”, X is assumed to be a distance matrix

但是当我尝试使用余弦度量时,我得到了一个错误:

A = np.matrix([[1, 0.7,0.5,0.6],[0.7,1,0.3,0.4],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]])
model = manifold.TSNE(metric="cosine")
Y = model.fit_transform(A) 

raise ValueError("All distances should be positive, either "
ValueError: All distances should be positive, either the metric or 
precomputed distances given as X are not correct

所以我的问题是,如何在现有数据集(相似度矩阵)上使用余弦度量来执行 TSNE?

【问题讨论】:

scikit学习什么版本? - 代码对我有用。 抱歉,我更新了我的代码,我使用函数fit_transform 来转换我的输入。错误似乎来自那里......我编写了一个不起作用的小部分:from sklearn import manifold import numpy as np A = np.matrix([[1, 0.7,0.5,0.6],[1, 0.7,0.5,0.6],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]]) model = manifold.TSNE(metric="cosine") Y = model.fit_transform(A) 【参考方案1】:

我可以回答您的大部分问题,但是我不太确定为什么在您的第二个示例中会出现该错误。

您已经计算了每个向量的余弦相似度,但 scikit 假定 TSNE 输入的距离矩阵。然而,这是一个非常简单的变换距离 = 1 - 相似度。所以对于你的例子

import numpy as np
from sklearn import manifold
A = np.matrix([[1, 0.7,0.5,0.6],[0.7,1,0.3,0.4],[0.5,0.3,1,0.1],[0.6,0.4,0.1,1]])
A = 1.-A
model = manifold.TSNE(metric="precomputed")
Y = model.fit_transform(A) 

这应该会给你你想要的转换。

【讨论】:

谢谢!我刚刚读过一篇关于这方面的论文。你是对的,它有效。更准确地说,我们可以加上这个值的平方根。你同意吗? 为什么是distance = 1 - similarity 定义为余弦度量,可以看wiki page【参考方案2】:

当前存在错误。看这里:https://github.com/scikit-learn/scikit-learn/issues/5772

但是 scikit 的 t-sne 使用与余弦距离成正比的平方欧几里得距离,假设您的数据是 L2 归一化的

【讨论】:

【参考方案3】:

可以用 sklearn pairwise_distances:

from sklearn.manifold import TSNE
from sklearn.metrics import pairwise_distances

distance_matrix = pairwise_distances(X, X, metric='cosine', n_jobs=-1)
model = TSNE(metric="precomputed")
Xpr = model.fit_transform(distance_matrix)

distance_matrix 中的值将在[0,2] 范围内,因为(1 - [-1,1])

【讨论】:

以上是关于sklearn.manifold 中的余弦相似度 TSNE的主要内容,如果未能解决你的问题,请参考以下文章

Python:两个大型numpy数组之间的余弦相似度

R中的余弦相似度矩阵

推荐算法-余弦相似度

余弦相似度计算

在没有循环的情况下按行计算 pandas 中的余弦相似度

如何使用Tensorflow获得数组的所有元素与同一数组中的所有其他元素的余弦相似度