【问题标题】:Python Pandas Distance matrix using jaccard similarity使用jaccard相似度的Python Pandas距离矩阵
【发布时间】:2023-03-07 23:23:02
【问题描述】:

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

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 的相似度必须是最大的,其他值似乎也错误

【问题讨论】:

  • 我觉得没问题,你能举一个你认为错误的值的例子,以及你的推理吗? 0 表示他们在每个坐标上都同意,1/3 表示他们在除一个之外的所有方面都同意,2/3 表示他们在除 2 之外的所有方面都同意,1 表示他们在每个坐标上都不同意

标签: python pandas matrix scipy


【解决方案1】:

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

在您的代码中,应尽量减少 0 和 1 之间的差异,确实如此。其他值在相异的情况下看起来也是正确的。

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

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

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2018-01-02
    • 2016-06-20
    • 2022-07-21
    相关资源
    最近更新 更多