使用 Jaccard Index Python 计算相似度

calculation the similarity by using Jaccard Index Python

我想使用 Jaccard Index 来查找数据帧元素之间的相似性 (user_choices)。

import scipy.spatial
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

user_choices = [[1, 0, 0, 1, 0, 1], 
                [0, 1, 0, 0, 0, 0], 
                [0, 0, 1, 0, 0, 0],
                [1, 0, 0, 1, 0, 1],
                [0, 0, 0, 0, 1, 0],
                [1, 0, 0, 1, 0, 1]]
df_choices = pd.DataFrame(user_choices, columns=["User A", "User B", "User C", "User D", "User E", "User F"], 
                          index=(["User A", "User B", "User C", "User D", "User E", "User F"]))

df_choices

我编写了这段代码来为我的数据计算 Jaccard 指数:

jaccard = (1-scipy.spatial.distance.cdist(df_choices, df_choices,  
                                       metric='jaccard'))
user_distance = pd.DataFrame(jaccard, columns=df_choices.index.values,  
                             index=df_choices.index.values)

user_distance

但这些是输出,与我的数据相同!

  • 例如行向量为(1,0,0,1,0,1)的用户F到用户A的Jaccard距离为零;然后你计算 1 - scipy.spatial.distance.cdist(...) = 1.

  • 来自例如的 Jaccard 距离。具有行向量(0, 0, 0, 0, 1, 0)到用户A的用户E是一个;你计算 1 - 1 = 0.

>>> print(scipy.spatial.distance.jaccard(user_choices[0], user_choices[5]))
0.0
>>> print(scipy.spatial.distance.jaccard(user_choices[0], user_choices[4]))
1.0

当使用 Jaccard 距离作为度量标准时,您可能不小心得到了与它自己的距离矩阵相同的输入,减去一。

也许您不希望那里出现 (1-...)?

如果我没理解错你想要user_distance[i,j] = jaccard-distance(df_choices[i], df_choices[j])

你可以分两步得到这个 (1) 计算对距离,这将得到有序对的距离 (2) 从压缩距离矩阵中得到平方形式。

jaccard = scipy.spatial.distance.pdist(df_choices, 'jaccard')
user_distances = pd.DataFrame(1-scipy.spatial.distance.squareform(jaccard), 
                              columns=df_choices.index.values,  
                              index=df_choices.index.values)

您有一个对称矩阵,因此距离矩阵应该是对称的

对于矩阵中的任何一对行,元素要么全部相等,要么全部不同,因此输出矩阵将只有 1 和 0。

如果您使用以下示例尝试相同的代码

user_choices = [[1, 0, 0, 3, 0, 4], 
                [0, 1, 0, 0, 0, 0], 
                [0, 0, 1, 0, 0, 0],
                [1, 0, 0, 1, 0, 1],
                [0, 0, 0, 0, 1, 0],
                [1, 0, 0, 1, 0, 1]]

您将得到与输入不同的输出。