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都是上亿级别,那难道这个矩阵的尺寸也这么大?而且是个极其稀疏的矩阵。感觉是自己想错了...

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值