您的位置:首页 > 其它

用户-商品矩阵转化及稀疏矩阵CSC,CSR,COO三种形式生成

2019-06-12 18:43 3571 查看

做推荐算法的同学,应该经常会用到基于用户-商品矩阵的协同过滤算法。

然而在项目的初期,我们其实只能获得每个用户对于商品的评分表sdf(如下):

针对这样的表,我们需要在python里进行一下转换

1.先生成一个基于用户和产品的dataFrame

[code]n_users = sdf['user_id'].unique()      #获得所有用户的id

n_items = sdf['item_name'].unique()    #获得所有产品的id

#生成一个基于用户为索引,产品为列的dataFrame
df = pd.DataFrame(index = n_users, columns = n_items)

2.将评分填入dataFrame

[code]#获取用户id,产品id及评分并赋值
for i in range(len(sdf)):
row_i = sdf.iloc[[i]]
user_id = row_i['user_id'].tolist()[0]
item_name = row_i['item_name'].tolist()[0]
rating = row_i['rating'].tolist()[0]
df.at[user_id,item_name] = rating

3.随后,我们就得到了关于用户-产品的矩阵,如下(这里我们填充缺失值为0)

可以看到df中含有大量的缺失值。可以预见一旦用户和产品数量大量增加时,此矩阵的维度会非常之大。

因此这里为了压缩空间,我们只记录有效评分,而忽略空值。

压缩矩阵的方式主要有三种:CSC,CSR,COO(需要用到scipy.parse模块)

1.CSC(Compressed sparse column)

CSC是按列存储一个稀疏矩阵的。其中indptr中的数据代表矩阵中每一列所存的数据在data中的开始和结束的索引,  
而indices中的数据代表所对应的data中的数据在其所在列中的所在行数 。

[code]Csc = sparse.csc_matrix(np.array(df))

Csc.indptr
#array([0, 1, 2, 3, 4, 5, 6], dtype=int32)

Csc.indices
#array([0, 1, 2, 0, 2, 1], dtype=int32)

Csc.data
#array([4, 9, 1, 3, 7, 2], dtype=int64)

2.CSR(Compressed sparse row)

CSR是按行来存储一个稀疏矩阵的,其原理与CSC类似。indptr中的数据表示矩阵中每一行的数据在data中开始和结束的索引,而indices中的数据表示所对应的在data中的数据在矩阵中其所在行的所在列数。可以看出,在indptr、indices和data三个数组相同的情况下,通过CSC和CSR分别表示出来的矩阵互为转置关系。

[code]Csr = sparse.csr_matrix(np.array(df))

Csr.indptr
#array([0, 2, 4, 6], dtype=int32)

Csr.indices
#array([0, 3, 1, 5, 2, 4], dtype=int32)

Csr.data
#array([4, 3, 9, 2, 1, 7], dtype=int64)

3.COO(coordinate)

COO是最简单的一种格式,每一个元素需要用一个三元组来表示,分别是(行号,列号,数值),但空间不是最优

[code]Coo = sparse.coo_matrix(np.array(df))

Coo.row
#array([0, 0, 1, 1, 2, 2], dtype=int32)

Coo.col
#array([0, 3, 1, 5, 2, 4], dtype=int32)

Coo.data
#array([4, 3, 9, 2, 1, 7], dtype=int64)

最后生成行索引,列索引,值的df即可

[code]pd.DataFrame({'index': Coo.row, 'col': Coo.col, 'data': Coo.data}).sort_values(['index', 'col'])

以上就是三种压缩用户-商品矩阵的方式。

整篇文章处理的代码已上传github:https://github.com/kunkun1230/Data-analysis/blob/master/sparse_matrix.ipynb

欢迎star!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: