sklearn.manifold 中的余弦相似度 TSNE
Cosine similarity TSNE in sklearn.manifold
我在使用余弦相似度对我的数据集执行 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 假设 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)
这应该会给你想要的转变。
当前存在错误。看这里:https://github.com/scikit-learn/scikit-learn/issues/5772
但是 scikit 的 t-sne 使用与余弦距离成正比的平方欧氏距离,假设您的数据是 L2 归一化的
可以用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])
.
我在使用余弦相似度对我的数据集执行 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 假设 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)
这应该会给你想要的转变。
当前存在错误。看这里:https://github.com/scikit-learn/scikit-learn/issues/5772
但是 scikit 的 t-sne 使用与余弦距离成正比的平方欧氏距离,假设您的数据是 L2 归一化的
可以用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])
.