SciPy中的稀疏矩阵是否存在(或为什么没有)矩阵平方根运算?

时间:2017-05-12 21:23:23

标签: python numpy scipy sparse-matrix

我在SciPy稀疏矩阵上搜索像scipy.linalg.sqrtm元素明智的平方根)的矩阵平方根运算,但我找不到任何东西。换句话说,scipy.sparse.linalg.sqrtm不存在。有没有人知道在稀疏矩阵上进行此操作的方法(除了转换为密集矩阵和使用SciPy' s linalg.sqrtm

人们已经提出了通过sparse_matrix**power对稀疏矩阵进行矩阵幂的方法,但它只能处理整数幂。

1 个答案:

答案 0 :(得分:0)

我在sqrtm中找不到numpy。我确实在scipy.linalg包中找到了它,scipy.linalg.sqrtm

我做了一个随机稀疏矩阵

In [377]: M=sparse.random(10,10,.2,'csr')

我在密集版本上尝试了sqrtm:

In [378]: linalg.sqrtm(M.A)
Matrix is singular and may not have a square root.

我第一次尝试这个时,得到了很多nan。第二个我有一个像:

的数组
Out[378]: 
array([[ 0.88617894 -5.55111512e-17j,  0.01749504 -2.77555756e-17j,
        -0.04458481 +2.77555756e-17j,  0.64717137 -8.32667268e-17j,
         ...
        -0.36856923 -2.77555756e-17j,  0.44353864 +3.29597460e-17j]])

即使我将其应用于M**2,我也会得到这种结果; linalg.sqrtm((M**2).A)

所以我认为你需要深入研究线性代数理论,并在使用稀疏矩阵时找出sqrtm是否有意义。 sqrtm引用Blocked Schur Algorithms(MATLAB使用相同的2013参考)。你明白这个方法吗?

使用更大的矩阵,我得到的案例不是单数:

In [427]: M=sparse.random(100,100,.1,'csr')
In [428]: M
Out[428]: 
<100x100 sparse matrix of type '<class 'numpy.float64'>'
    with 1000 stored elements in Compressed Sparse Row format>
In [429]: a1=linalg.sqrtm(M.A)
In [430]: np.allclose(a1.dot(a1),M.A)
Out[430]: True

生成的数组看起来不太稀疏。这是通过密集代码的工件,还是正常的?如果结果几乎总是密集的,那么实现稀疏版本没有意义,是吗?

In [431]: a1
Out[431]: 
array([[ 0.62268422+0.03131536j, -0.27157347-0.17225629j,
        -0.08630637-0.07467316j, ...,  0.09462768+0.03892438j,
         0.01204048-0.07234779j, -0.08013413+0.0382219j ],
       [-0.08049302-0.09802712j,  0.54396429+0.03354472j,
        -0.07932389+0.16519734j, ...,  0.01665645+0.03595561j,
        -0.04592068+0.03031138j,  0.19135217-0.06070762j],
       [ 0.05835017-0.05424398j,  0.05459725+0.12541806j,
         0.69837931+0.22229791j, ..., -0.07561791-0.01402142j,
         0.02495625-0.00127714j,  0.07991591-0.03378647j],
       ..., 
       [ 0.06234687-0.07739042j,  0.14074254+0.08867074j,
        -0.12518048+0.2243023j , ...,  0.68834226+0.06496256j,
        -0.02286238+0.03550603j,  0.10621082+0.0017906j ],
       [ 0.04219961+0.03750657j, -0.41050630-0.03515527j,
        -0.10442910-0.03450125j, ..., -0.20640545-0.00679942j,
         0.55934004-0.03639518j,  0.07098921+0.02929779j],
       [ 0.09551901-0.03121943j, -0.20974550-0.11607423j,
        -0.19168294-0.01187921j, ..., -0.23618268+0.09158539j,
        -0.18803705+0.00693476j,  0.63079575+0.02476722j]])

在任何情况下,我都无法告诉你为什么没有这样的功能,因为我不是scipy.sparse开发人员。但是这个简短的探索表明这样的功能是不实际的。为了显示其他情况,您需要提供示例数组 - 最好是稀疏矩阵具有稀疏sqrtm的数组,并且计算速度比使用密集等效数据时更快。