2017-08-15 215 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

相關問題