2017-08-15 214 views
0

我有一个user_id作为列的dataframe和他们喜欢的电影的id作为行值。 (即每个用户之间的使用他们喜欢的电影)计算不同长度的DataFrame列之间的Jaccard相似度

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相似:这里有一个片段。 Python中提供了以下错误,当我尝试使用sklearn发现jaccard_similarity_score:

ValueError: continuous is not supported 

理想的情况下,作为一个结果,我想获得的行和USER_ID的列和值的相似度得分矩阵每。

如何才能计算这些列之间的jaccard相似度?我试图使用带键的字典列表作为用户ID和值作为电影列表,但它需要永远计算。

+1

https://stackoverflow.com/questions/37003272/how-to-compute-jaccard-similarity-from-a-pandas-dataframe – MaxU

+0

我列具有不等的长度,我不应该做的可能欺骗因为相同的movie_id不一定具有相同的索引(即我不应该比较column_1 [i]和column_2 [i],我应该改为set(column [1])vs set(column [2])) – b104

+0

你发布你想要的数据集? – MaxU

回答

0

由于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 
+0

这个作品非常感谢! – b104

相关问题