微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scipy coo_matrix.max() 改变数据属性

如何解决Scipy coo_matrix.max() 改变数据属性

我正在使用开源库 LightFM 构建推荐系统。该库要求某些数据采用稀疏矩阵格式,特别是 scipy coo_matrix。正是在这里,我遇到了奇怪的行为。这似乎是一个错误,但更有可能是我做错了什么。

基本上,我让 LightFM.Dataset 为我构建一个稀疏矩阵,如下所示:

interactions,weights = dataset.build_interactions(data=_get_interactions_data())

build_interactions 方法返回“两个 COO 矩阵:交互矩阵和相应的权重矩阵”——LightFM Official Doc

当我检查这个稀疏矩阵的内容时(实际上,我使用调试器),如下所示:

for i in interactions.data:
    print(i,end=',')

1,1,....

它打印了一长串 1,这表明稀疏矩阵的非零元素只有 1。

但是,当我第一次检查稀疏矩阵的最大值时,它表明稀疏矩阵中的最大值不是 1,而是 3。此外,在检查之后打印矩阵将打印一长串 1 、2s 和 3s。这是代码

print(interactions.max())
for i in interactions.data:
    print(i,')

3
1,3,2,...

知道这里发生了什么吗? Python 是 3.6.8。 Scipy 是 1.5.4。 CentOS7。

谢谢。

解决方法

“原始” coo_matrix 可以有重复的元素(相同行和列值的重复),但是当转换为 csr 格式进行计算时,这些重复项会相加。它必须执行相同的操作,但就地进行,以便找到最大值。

In [9]: from scipy import sparse
In [10]: M = sparse.coo_matrix(([1,1,1],([0,0],[0,2])))
In [11]: M.data
Out[11]: array([1,1])
In [12]: M.max()
Out[12]: 3
In [13]: M.data
Out[13]: array([3,2,1])
In [14]: M
Out[14]: 
<1x3 sparse matrix of type '<class 'numpy.int64'>'
    with 3 stored elements in COOrdinate format>

跟踪 max 代码我发现它使用了 sum_duplicates

In [33]: M = sparse.coo_matrix(([1,2])))
In [34]: M.data
Out[34]: array([1,1])
In [35]: M.sum_duplicates?
Signature: M.sum_duplicates()
Docstring:
Eliminate duplicate matrix entries by adding them together

This is an *in place* operation
File:      /usr/local/lib/python3.8/dist-packages/scipy/sparse/coo.py
Type:      method
In [36]: M.sum_duplicates()
In [37]: M.data
Out[37]: array([3,1])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。