使用 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]]
您将得到与输入不同的输出。
我想使用 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]]
您将得到与输入不同的输出。