scipy.linalg.sparse.eigsh returns 半正定矩阵的负特征值和非一致特征值
scipy.linalg.sparse.eigsh returns negative and non-consistent eigenvalues for positive semi-definite matrix
我尝试使用scipy.linalg.sparse.eigsh(我们称之为方法1:M1)来计算实对称半定矩阵的拉普拉斯矩阵的最小特征值W.
作为基准,我 运行 针对 scipy.linalg.eigh 的计算(方法 2:M2)。似乎M1returns与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
不会影响 st运行ge 结果.关于负特征值,不幸的是我一无所知。
我是 运行宁 :
Python 3.7.0(默认,2018 年 6 月 28 日,13:15:42)
[GCC 7.2.0] :: Anaconda, Inc. linux
NumPy 和 SciPy 是针对 Intel MKL 构建的。
有谁能赐教吗?预先感谢您的宝贵时间。
您的矩阵 A
是奇异矩阵,即 0 是 A
的特征值。 shift-invert 方法中 sigma
的值本身不能是特征值。查看 ARPACK 文档的 "Shift and Invert Spectral Transformation Mode" 部分。
相同的公式显示在SciPy tutorial中。 shift-invert 方法的公式是
inv(A - sigma*M) @ M @ x = nu*x
(Argh,我真希望 Whosebug 有 LaTeX 标记!)当 sigma
为 0 时,A - sigma*M
就是 A
,并且inv(A)
不存在。
我尝试使用scipy.linalg.sparse.eigsh(我们称之为方法1:M1)来计算实对称半定矩阵的拉普拉斯矩阵的最小特征值W.
作为基准,我 运行 针对 scipy.linalg.eigh 的计算(方法 2:M2)。似乎M1returns与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
不会影响 st运行ge 结果.关于负特征值,不幸的是我一无所知。
我是 运行宁 :
Python 3.7.0(默认,2018 年 6 月 28 日,13:15:42)
[GCC 7.2.0] :: Anaconda, Inc. linux
NumPy 和 SciPy 是针对 Intel MKL 构建的。
有谁能赐教吗?预先感谢您的宝贵时间。
您的矩阵 A
是奇异矩阵,即 0 是 A
的特征值。 shift-invert 方法中 sigma
的值本身不能是特征值。查看 ARPACK 文档的 "Shift and Invert Spectral Transformation Mode" 部分。
相同的公式显示在SciPy tutorial中。 shift-invert 方法的公式是
inv(A - sigma*M) @ M @ x = nu*x
(Argh,我真希望 Whosebug 有 LaTeX 标记!)当 sigma
为 0 时,A - sigma*M
就是 A
,并且inv(A)
不存在。