python函数之csr_matrix
csr_matrix表示逐行(注意csr的r,row)压缩矩阵,类似地,也有个函数csc_matrix(c:column)表示逐列压缩。
形式:csr_matrix( (data, indices, indptr), shape=(x,y) )
shape就是压缩后的矩阵的形状,x行y列;
data就是矩阵里面存储的值;
indptr可以看作是记录了每个会话中的项目数量;(在推荐中有多个用户,每个用户创建了多个会话,每个会话有多个项目)
indice可以看作是压缩后的矩阵的列的索引;
例:
#红色表示第1个会话里的项目;蓝色表示第2个会话里的项目,绿色表示第3个会话里的项目
indice : [1, 2, 0, 1, 2, 0, 1];
#通过indptr可以看出,第1个会话中有2-0=2个项目,第2个会话有5-2 =3个项目,第3个会话有7-5=2个项目
indptr:[0, 2, 5, 7];
data:[1, 1, 1, 1, 1, 1, 1];
matrix output:
[[0 1 1]
[1 1 1]
[1 1 0]]
具体计算过程就是,依次逐行压缩:
首先当i=0(也就是第0行)时,也就是对第一个会话中的两个项目进行操作,取得 indptr[i]和indptr[i+1],即0和2;将其作为indice列表的切片值,indice[0:2]=[1,2],也就是说在第0行时,第1列和第2列有非零值,将indptr[i]和indptr[i+1]作为data列表的切片值,data[0:2]=[1,1],其第1列和第2列的值就为1,1;其余列的值为0。
然后i=1,2…依次操作就完成了。
这个函数的解释大概就是这样,
下面是推荐场景中个人关于data_mask方法的处理逻辑的记录,可以不用看了。
——————————————————————————————————————————-
在DHCN这篇论文中,此矩阵可以当作是data_mask矩阵返回, x:all_session,y:n_node.也就是说该矩阵的行可以看作是所有的会话,列看作是所有的项目。
例:原矩阵输入为
u_inputs = [ [2, 2, 11, 2], [2, 3, 12, 2], [1, 1, 1, 2], ]
经过去重后,
u_inputs = [
[2, 11],
[2, 3, 12],
[1 ,2],
]
indptr:[0, 2 ,5, 7]
indice:[1, 10, 1 ,2 ,11, 0, 1] #每个项目-1
data:[1,1,1,1,1,1,1]
matrix:
[0,1,0,0,0,0,0,0,0,0,1,0]
[0,1,1,0,0,0,0,0,0,0,0,1]
[1,1,0,0,0,0,0,0,0,0,0,0]
这个就是data_mask方法最后返回的东西。
但因为目前才刚开始跑别人论文的代码,所以有许多地方仍不是很清楚。
具体来说,有两处疑问:
1.这个矩阵的用途;
2.这个矩阵的索引是由indice列表决定的,也就是说这个矩阵的尺寸完全是由indice列表里面的决定,但indice列表里的值仅仅是项目id-1,一般来说,数据集中的项目id都是上亿级别,那难道这个矩阵的尺寸也这么大?而且是个极其稀疏的矩阵。感觉是自己想错了…
来源:绵蛮阿