0

我在尝试计算稀疏矩阵的 1 范数时遇到了一个问题。我正在使用该函数scipy.sparse.linalg.onenormest,但它给了我一个错误,因为运算符只能作用于方阵。

这是一个代码示例:

from scipy import sparse

row = array([0,2,2,0,1,2])
col = array([0,0,1,2,2,2])
data = array([1,2,3,4,5,6])

A = sparse.csc_matrix( (data,(row,col)), shape=(5,3) )

onenormest(A)

这是错误:

Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
  File "C:\Python27\lib\site-packages\scipy\sparse\linalg\_onenormest.py", line 76, in onenormest
    raise ValueError('expected the operator to act like a square matrix')
ValueError: expected the operator to act like a square matrix

如果我将 A 定义为方阵,则运算符onenormest可以工作,但这不是我想要的。

任何人都知道如何计算稀疏非方阵的 1 范数?

4

2 回答 2

1

我认为您需要numpy.linalg.norm

from numpy import linalg
from scipy import sparse


row = array([0,2,2,0,1,2])
col = array([0,0,1,2,2,2])
data = array([1,2,3,4,5,6])

A = sparse.csc_matrix( (data,(row,col)), shape=(5,3) )

print linalg.norm(A.todense(), ord=1) #15

调用 A.data 不起作用,因为.data稀疏矩阵对象只是数据 - 它显示为向量。

如果您的稀疏矩阵很小,那么这很好。如果它很大,那么显然这是一个问题。在这种情况下,您可以编写自己的例程。

如果您只对L^1-norm, 并且无法进行密集转换感兴趣,那么您可以通过以下方式进行:

def sparseL1Norm = lambda A: max([numpy.abs(A).getcol(i).sum() for i in range(A.shape[1])])
于 2014-11-06T14:15:47.633 回答
1

求每列的 L1 范数:

from scipy import sparse
import numpy as np

row = np.array([0,2,2,0,1,2])
col = np.array([0,0,1,2,2,2])
data = np.array([1,2,3,-4,-5,-6]) # made negative to exercise abs
A = sparse.csc_matrix( (data,(row,col)), shape=(5,3) )
print(abs(A).sum(axis=0))

产量

[[ 3  3 15]]

然后你可以取最大值来找到矩阵的 L1 范数:

print(abs(A).sum(axis=0).max())
# 15

abs(A)是一个稀疏矩阵:

In [29]: abs(A)
Out[29]: 
<5x3 sparse matrix of type '<type 'numpy.int64'>'
    with 6 stored elements in Compressed Sparse Column format>

summax是稀疏矩阵的方法,因此abs(A).sum(axis=0).max()计算 L1 范数而不致密矩阵。

注意:大多数 NumPy 函数(例如 np.abs)并非设计用于处理稀疏矩阵。虽然np.abs(A)返回正确的结果,但它是通过间接路径到达那里的。更直接的路线是使用abs(A)which calls A.__abs__()感谢光伏。指出这一点。

于 2014-11-06T14:22:47.640 回答