2016-06-16 34 views
5

Tôi có từ điển có khóa là user_ids và các giá trị dưới dạng danh sách các movie_ids được người dùng đó thích với #unique_users = 573000 và # unique_movies = 16000.chuyển từ điển sang ma trận thưa thớt

{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],..........}

Bây giờ tôi muốn chuyển đổi này vào thành một ma trận với hàng như user_ids và cột như movies_id với giá trị 1 cho những bộ phim mà người dùng đã thích tức là nó sẽ là 573000 * 16000

Cuối cùng tôi phải nhân ma trận này với nó transpose để có ma trận co-occurrence với dim (# unique_movies, # unique_movies).

Ngoài ra, độ phức tạp của hoạt động X '* X là bao nhiêu khi X giống như (500000,12000).

Trả lời

1

Tôi nghĩ bạn có thể tạo một ô trống dok_matrix và điền vào các giá trị. Sau đó, chuyển nó và chuyển nó sang csr_matrix để nhân ma trận hiệu quả.

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

nhưng sau đó cho vòng lặp sẽ có 57300 lần lặp lại vì đó là số người dùng riêng biệt trong từ điển –

+0

@chiragyadav Tôi nghĩ điều đó sẽ hiệu quả vì bạn đã lập chỉ mục dữ liệu của mình trong từ điển và dok_matrix hiệu quả cho việc xây dựng ma trận gia tăng. –

+0

'nhập khẩu scipy.sparse như sp mat = sp.dok_matrix ((576808,11287), dtype = np.int8) cho uid, brand_list trong user_pref_dict.items(): mat [uid, brand_list] = 1' Đã thử mã ở trên nhưng nó ném lỗi dưới đây: chỉ số (131) ngoài phạm vi -11287 đến 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) 

này chuyển dict vào một dataframe, tiếp theo là xếp chồng để có được userIds và movieIDs trong các cột riêng biệt, sau đó tất cả các giá trị của level_1 cột không sử dụng được thiết lập để 1. tuyên bố cuối tạo ra một điền bảng pivot các kết hợp không tồn tại với số không.

0

Bạn có thể tạo csr_matrix cùng một lúc (như định dạng này: csr_matrix((data, (row_ind, col_ind))). Đây là một đoạn về cách làm điều đó.

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 

Bạn có thể sử dụng ma trận X để tìm ma trận cooccurrence sau (ví dụ: X.T * X) (tín dụng github @ daniel-acuna). Tôi đoán có một cách nhanh hơn để chuyển đổi từ điển của danh sách thành row_ind, col_ind.

Các vấn đề liên quan