我有一个购买数据(df_temp)。 我设法用熊猫数据框中使用稀疏csr_matrix,因为我有很多的产品(89000),我必须让他们的用户 - 项目信息(购买或不购买),然后计算产品之间的相似性来代替。
首先,我转换熊猫数据帧到numpy的数组:
df_user_product = df_temp[['user_id','product_id']].copy()
ar1 = np.array(df_user_product.to_records(index=False))
其次,创造了coo_matrix ,因为它知道在稀疏矩阵建设速度快。
rows, r_pos = np.unique(ar1['product_id'], return_inverse=True)
cols, c_pos = np.unique(ar1['user_id'], return_inverse=True)
s = sparse.coo_matrix((np.ones(r_pos.shape,int), (r_pos, c_pos)))
第三,对于矩阵的计算,它最好使用csr_matrix或csc_matrix ,所以我用csr_matrix如我在行=>更有效行切片比csc_matrix的PRODUCT_ID(多个)。
sparse_csr_mat = s.tocsr()
sparse_csr_mat[sparse_csr_mat > 1] = 1
然后,我计算出的余弦相似产品之间,并把结果相似 :
import sklearn.preprocessing as pp
col_normed_mat = pp.normalize(sparse_csr_mat, axis=1)
similarities = col_normed_mat * col_normed_mat.T
那就是:
<89447x89447 sparse matrix of type '<type 'numpy.float64'>'
with 1332945 stored elements in Compressed Sparse Row format>
现在,我想有在最后一本字典,其中每个产品,有5种最相似的产品。 怎么做? 我不想稀疏矩阵转换为密集排列,因为内存的使用限制。 但我也并不知道是否有像我们的数组,其中我们检查例如指数= PRODUCT_ID,并得到所有的行做访问csr_matrix的方式,其中指数= PRODUCT_ID,这样我会得到所有的同类产品PRODUCT_ID和排序余弦相似度值获得5个最相似的。
例如,在相似行矩阵:
(product_id1, product_id2) 0.45
如何筛选只(在我的情况下= 5)的X最相似的产品product_id1,而无需将矩阵转换为数组?
展望#1 ,我觉得lil_matrix可以用于这种情况? 怎么样?
谢谢您的帮助!