2016-06-16 166 views
5

我有一个字典,其键值为user_id和值,作为用户使用#unique_users = 573000和#unique_movies = 16000所喜欢的movie_ids列表。将字典转换为稀疏矩阵

{1: [51, 379, 552, 2333, 2335, 4089, 4484], 2: [51, 379, 552, 1674, 1688, 2333, 3650, 4089, 4296, 4484], 5: [783, 909, 1052, 1138, 1147, 2676], 7: [171, 321, 959], 9: [3193], 10: [959], 11: [131,567,897,923],..........}

现在我想将其转换成与行作为user_ids和列的矩阵与值1 movies_id针对用户喜欢也就是说,它的电影将是573000 * 16000

最终我不得不将此矩阵与它的转置相乘以得到具有dim的同现矩阵(#unique_movies,#unique_movies)。

另外,X'* X操作的时间复杂度是X(X = 500000,12000)。

回答

1

我想你可以构造一个空的dok_matrix并填写值。然后转置它并将其转换为csr_matrix以进行有效的矩阵乘法。

import numpy as np 
import scipy.sparse as sp 
d = {1: [51, 379, 552, 2333, 2335, 4089, 4484], 2: [51, 379, 552, 1674, 1688, 2333, 3650, 4089, 4296, 4484], 5: [783, 909, 1052, 1138, 1147, 2676], 7: [171, 321, 959], 9: [3193], 10: [959], 11: [131,567,897,923]} 

mat = sp.dok_matrix((573000,16000), dtype=np.int8) 

for user_id, movie_ids in d.items(): 
    mat[user_id, movie_ids] = 1 

mat = mat.transpose().tocsr() 
print mat.shape 
+0

但是然后for循环将是57300次迭代,因为这是字典中不同用户的数量 –

+0

@chiragyadav我认为这应该是有效的,因为您已经将字典中的数据编入索引并且dok_matrix对于构建有效增量式矩阵。 –

+0

'进口scipy.sparse作为SP 垫= sp.dok_matrix((576808,11287),D型细胞= np.int8) 为UID,brand_list在user_pref_dict.items(): 垫[UID,brand_list] = 1' 试过上面的代码,但它投掷下面的错误: 指数(131)超出范围-11287到11286) –

2
df = {1: [51, 379, 552, 2333, 2335, 4089, 4484], 2: [51, 379, 552, 1674, 1688, 2333, 3650, 4089, 4296, 4484], 5: [783, 909, 1052, 1138, 1147, 2676], 7: [171, 321, 959], 9: [3193], 10: [959], 11: [131,567,897,923],..........} 
df2 = pd.DataFrame.from_dict(df, orient='index') 
df2 = df2.stack().reset_index() 
df2.level_1=1 
df2.pivot(index='level_0',columns=0,values='level_1').fillna(0) 

此转换字典成数据帧,然后通过堆叠来获得单独的列中的用户ID和movieIDs,则未使用的列LEVEL_1的所有值设置为1,最后一条语句创建一个数据透视表填充与零不存在的组合。

0

您可以一次创建csr_matrix(如此格式:csr_matrix((data, (row_ind, col_ind)))。这里是如何做到这一点的片段。

import scipy.sparse as sp 
d = {0: [0,1], 1: [1,2,3], 
    2: [3,4,5], 3: [4,5,6], 
    4: [5,6,7], 5: [7], 
    6: [7,8,9]} 
row_ind = [k for k, v in d.items() for _ in range(len(v))] 
col_ind = [i for ids in d.values() for i in ids] 
X = sp.csr_matrix(([1]*len(row_ind), (row_ind, col_ind))) # sparse csr matrix 

可以使用矩阵X后来发现出现矩阵(即X.T * X)(信用github上@丹尼尔 - 阿库纳)。我想有一个更快的方法来转换列表字典row_indcol_ind