我已经实现了一个使用杰卡德相似度构造距离矩阵的函数:
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)
问题是我的结果看起来像这样,这似乎是错误的:
我错过了什么?例如,0 和 1 的相似度必须是最大的,其他值似乎也是错误的
使用
pairwise_distances
计算大型 Jaccard 距离矩阵比 pdist
快得多。
from sklearn.metrics.pairwise import pairwise_distances
pairwise_distances(df.values, metric="jaccard")
参见 root 对原始问题的答案