用户-商品矩阵转化及稀疏矩阵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!
相关文章推荐
- scipy.sparse中csc_martrix和csr_matrix两个稀疏矩阵的区别
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵 存储格式 COO CSR DIA ELL HYB
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 稀疏矩阵的存储格式 之 CSR/CSC
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
- 矩阵的转化问题【行列互换】(稀疏矩阵)
- 稀疏矩阵存储格式CSC(Compressed Sparse Columns Format)
- matlab生成随机数的rand、randi和randn三种形式
- 矩阵的转化问题【行列互换】(稀疏矩阵)
- EOJ1810 稀疏矩阵三元组转化
- 递推式转化为矩阵形式