scipy.linalg.sparse.eigsh返回正半定矩阵的负和不一致特征值

时间:2018-11-07 10:37:12

标签: python python-3.x numpy scipy eigenvalue

我尝试使用 scipy.linalg.sparse.eigsh (我们将其称为方法1:M1)来计算实对称半定矩阵W的拉普拉斯矩阵的最小特征值。 / p>

作为基准,我对 scipy.linalg.eigh (方法2:M2)进行了计算。 M1似乎返回了与M2不同的特征值,而且这些特征值似乎是错误的。

这是代码:

# Initialization
N=10
np.random.seed(0) # for reproducibility 
Nvp=4

# Create a real symmetric semi-definite matrix W, precision float64
X=np.random.random((N,N))
W=np.dot(X, X.T) 
W=np.array(W, dtype=np.float64) 

# Compute its Laplacian matrix A, precision float64
d=np.array([sum(W[:][j]) for j in range(N)], dtype=np.float64)
D=np.diag(d)
A=D-W
for i in range(N):
    for j in range(N):
        A[i][j]/=np.sqrt(d[i], dtype=np.float64)*np.sqrt(d[j], dtype=np.float64)
A=np.array(A, dtype=np.float64)

我们的支票A格式正确:

>>> A.dtype
dtype('float64')
>>> np.allclose(A, A.T)
True

现在让我们运行一些测试:

## 1) Compute A's smallest eigenvalues by 2 different means
wA2, vA2 = la.eigh(A)
wA1, vA1 = sparse.eigsh(A, k=Nvp, sigma=0, which='LM')

## 2) Compute W's smallest eigenvalues by 2 different means
wW2, vW2 = la.eigh(W)
wW1, vW1 = sparse.eigsh(W, k=Nvp, sigma=0, which='LM')

# Output computed eigenvalues
print(wA2[:Nvp])
print(wA1[:Nvp])
print(wW2[:Nvp])
print(wW1[:Nvp])

以下是输出:

>>>[-1.88737914e-15  9.03999970e-01  9.23513143e-01  9.52678423e-01]

[-4.93242313e-01 -8.14381749e-17  9.22235466e-01  9.44848237e-01]

[0.00575077 0.04770667 0.08565863 0.16319798]

[0.00575077 0.04770667 0.08565863 0.16319798]

此第一输出显示M1计算出A的负特征值,这在数学上是不可能的。而且,如果其中一个检查了其他计算,那么说第三个:

>>> np.dot(A, vA2[:,2])-wA2[2]*vA2[:,2]
array([-0.01183104, -0.25059123,  0.47372558, -0.31358618, -0.2968036 ,
   -0.04832199,  0.40973325, -0.01369472,  0.33267859, -0.27122678])

它甚至不接近零。我必须添加每次都不同的计算特征值。对我来说,这是由于初始化向量。我会说 scipy.linalg.sparse.eigsh 不会进行足够的迭代以使其与真实结果足够接近,但是设置maxiter=1000000不会影响奇怪的结果。关于负特征值,很遗憾,我一无所知。

我正在跑步:

Python 3.7.0(默认值,2018年6月28日,13:15:42)

[GCC 7.2.0] :: Linux上的Anaconda,Inc.

NumPy和SciPy是针对Intel MKL构建的。

有人可以启发我吗?预先感谢您的宝贵时间。

1 个答案:

答案 0 :(得分:0)

您的矩阵A是奇异的,即0是A的特征值。移位反转方法中的sigma的值本身不能为特征值。看一下ARPACK文档的https://stackoverflow.com/a/52847569/1554499部分。

"Shift and Invert Spectral Transformation Mode"中显示了相同的公式。移位反转方法的公式为

inv(A - sigma*M) @ M @ x = nu*x

Argh ,我真的希望stackoverflow具有LaTeX标记!)当sigma为0时,A - sigma*M仅是A,而inv(A)不存在。