python-2.7 - 为什么 scikit-learn 的最近邻似乎没有返回正确的余弦相似距离?

标签 python-2.7 scikit-learn nearest-neighbor cosine-similarity

我正在尝试使用 scikit 的 Nearest Neighbor 实现从随机值矩阵中找到最接近给定列向量的列向量。

此代码应该找到第 21 列的最近邻居,然后检查这些邻居与第 21 列的实际余弦相似度。

from sklearn.neighbors import NearestNeighbors
import sklearn.metrics.pairwise as smp
import numpy as np

test=np.random.randint(0,5,(50,50))
nbrs = NearestNeighbors(n_neighbors=5, algorithm='auto', metric=smp.cosine_similarity).fit(test)
distances, indices = nbrs.kneighbors(test)

x=21   

for idx,d in enumerate(indices[x]):

    sim2 = smp.cosine_similarity(test[:,x],test[:,d])


    print "sklearns cosine similarity would be ", sim2
    print 'sklearns reported distance is', distances[x][idx]
    print 'sklearns if that distance was cosine, the similarity would be: ' ,1- distances[x][idx]

输出看起来像
sklearns cosine similarity would be  [[ 0.66190748]]
sklearns reported distance is 0.616586738214
sklearns if that distance was cosine, the similarity would be:  0.383413261786

所以kneighbors的输出既不是余弦距离也不是余弦相似度。是什么赋予了?

另外,顺便说一句,我认为 sklearn 的最近邻实现不是近似最近邻方法,但与我在矩阵上迭代并检查得到的结果相比,它似乎没有检测到我数据集中的实际最佳邻居第 211 列与所有其他列的相似之处。我在这里误解了一些基本的东西吗?

最佳答案

好的,问题是 NearestNeighbors 的 .fit() 方法,默认情况下假定行是样本,列是特征。在传递矩阵之前,我必须转置矩阵。

编辑:另外,另一个问题是作为度量传递的可调用对象应该是距离可调用对象,而不是相似性可调用对象。否则你会得到 K 最远的邻居:/

关于python-2.7 - 为什么 scikit-learn 的最近邻似乎没有返回正确的余弦相似距离?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23032628/

相关文章:

java - 寻找二维数组的邻居

python - 检查一组坐标与另一组坐标的接近程度

python - pathos.ProcessingPool 和 pickle 之间的交互

csv - 如何创建 scikit learn 数据集?

python - 装饰类方法以构建方法注册表

python - 如何在学习中使用 Mann-Whitney U 检验

python - 增加决策树中节点的大小

algorithm - 为什么我们需要粗量化器?

python - Django 将 ImageField 指向一个已经存在的图像

python - 找不到谷歌应用引擎 dev_appserver.py 文件