Python Pandas 使用杰卡德相似度的距离矩阵

问题描述 投票:0回答:2

我已经实现了一个使用杰卡德相似度构造距离矩阵的函数:

import pandas as pd
entries = [
    {'id':'1', 'category1':'100', 'category2': '0', 'category3':'100'},
    {'id':'2', 'category1':'100', 'category2': '0', 'category3':'100'},
    {'id':'3', 'category1':'0', 'category2': '100', 'category3':'100'},
    {'id':'4', 'category1':'100', 'category2': '100', 'category3':'100'},
    {'id':'5', 'category1':'100', 'category2': '0', 'category3':'100'}
           ]
df = pd.DataFrame(entries)

和 scipy 的距离矩阵

from scipy.spatial.distance import squareform
from scipy.spatial.distance import pdist, jaccard

res = pdist(df[['category1','category2','category3']], 'jaccard')
squareform(res)
distance = pd.DataFrame(squareform(res), index=df.index, columns= df.index)

问题是我的结果看起来像这样,这似乎是错误的:

enter image description here

我错过了什么?例如,0 和 1 的相似度必须是最大的,其他值似乎也是错误的

python pandas matrix scipy
2个回答
12
投票

查看文档,jaccard

scipy.spatial.distance
的实现是jaccard dissimilarity,而不是相似性。这是使用 jaccard 作为度量时计算距离的常用方法。  这样做的原因是因为为了成为一个度量,相同点之间的距离必须为零。

在你的代码中,0 和 1 之间的差异应该最小化,事实也确实如此。 在差异的背景下,其他值看起来也是正确的。

如果你想要相似性而不是相异性,只需从 1 中减去相异性即可。

res = 1 - pdist(df[['category1','category2','category3']], 'jaccard')

0
投票

使用

pairwise_distances
计算大型 Jaccard 距离矩阵比
pdist
快得多。

from sklearn.metrics.pairwise import pairwise_distances

pairwise_distances(df.values, metric="jaccard")

参见 root 对原始问题的答案

© www.soinside.com 2019 - 2024. All rights reserved.