【问题标题】:Computing Jaccard Similarity between DataFrame Columns with Different Lengths计算不同长度 DataFrame 列之间的 Jaccard 相似度
【发布时间】:2018-01-23 07:47:34
【问题描述】:

我有一个数据框,其中 user_ids 作为列,他们喜欢的电影的 ID 作为行值。这是一个sn-p:

   15       30       50        93       100     113      1008    1028    
0  3346.0  42779.0   1816.0  191319.0    138.0   183.0    171.0   283.0   
1  1543.0      NaN    169.0    5319.0  34899.0   188.0  42782.0  1183.0   
2  5942.0      NaN  30438.0  195514.0    169.0   172.0    187.0  5329.0   
3  3249.0      NaN  32361.0     225.0     87.0   547.0   6710.0   283.0   
4   794.0      NaN    187.0  195734.0   6297.0  8423.0   1289.0   222.0   

我正在尝试计算每列之间的 Jaccard 相似度(即使用他们喜欢的电影的每个用户之间)。当我尝试使用 sklearn 中的 jaccard_similarity_score 时,Python 会出现以下错误:

ValueError: continuous is not supported

因此,理想情况下,我想获得一个矩阵,其中包含 user_id 的行和列,并将值作为每个矩阵的相似度得分。

如何计算这些列之间的 jaccard 相似度?我尝试使用带有键作为用户 ID 和值作为电影列表的字典列表,但它需要很长时间来计算。

【问题讨论】:

  • 我的列的长度不相等,我不应该成对做,因为相等的 movie_id 不一定有相等的索引(即我不应该比较 column_1[i] 和 column_2[i]。我应该改为做 set(column[1]) vs set(column[2]))
  • 你能发布你想要的数据集吗?
  • 你的意思是想要的结果吗?
  • 是的,在问题中发布您想要的结果

标签: python python-2.7 pandas scikit-learn


【解决方案1】:

由于sklearn.metrics.jaccard_similarity_score 需要两个长度相等的输入向量,您可以尝试以下方法,部分改编自this 类似问题。

import itertools
import pandas as pd

# Method to compute Jaccard similarity index between two sets
def compute_jaccard(user1_vals, user2_vals):
    intersection = user1_vals.intersection(user2_vals)
    union = user1_vals.union(user2_vals)
    jaccard = len(intersection)/float(len(union))
    return jaccard

# Small test dataframe
users = ['user1', 'user2', 'user3']
df = pd.DataFrame( 
    np.transpose(np.array([[1,2,3],[3,np.NAN,7], [np.NAN, np.NAN,3]])), 
    columns=users)
sim_df = pd.DataFrame(columns=users, index=users)

# Iterate through columns and compute metric
for col_pair in itertools.combinations(df.columns, 2):
    u1= col_pair[0]
    u2 = col_pair[1]
    sim_df.loc[col_pair] = compute_jaccard(set(df[u1].dropna()), set(df[u2].dropna()))


print sim_df

这将返回相似矩阵的以下(上三角)一半,其中对角线当然是全1。

        user1  user2     user3
user1   NaN    0.25      0.333333
user2   NaN    NaN       0.5
user3   NaN    NaN       NaN

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 2017-03-27
    • 1970-01-01
    • 2016-09-01
    • 2019-03-26
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多