我在SciPy稀疏矩阵上搜索像scipy.linalg.sqrtm
(不元素明智的平方根)的矩阵平方根运算,但我找不到任何东西。换句话说,scipy.sparse.linalg.sqrtm
不存在。有没有人知道在稀疏矩阵上进行此操作的方法(除了转换为密集矩阵和使用SciPy' s linalg.sqrtm
)
人们已经提出了通过sparse_matrix**power
对稀疏矩阵进行矩阵幂的方法,但它只能处理整数幂。
答案 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的数组,并且计算速度比使用密集等效数据时更快。