Numpy最大的奇异值大于最大的特征值。

问题描述 投票:0回答:2

import numpy as np

M = np.array([[ 1., -0.5301332 , 0.80512845],
              [ 0., 0., 0.],
              [ 0., 0., 0.]])

M 是等级一,它唯一的非零特征值是1(它的轨迹)。然而 np.linalg.norm(M, ord=2) 返回1.39,严格来说大于1,为什么?

M的特征值,由 np.linalg.eigvals 是1,0,0,但M的奇异值是1.39,0,0,这让我很意外。我到底错过了什么?

python numpy linear-algebra
2个回答
0
投票

矩阵的第二准则 所有元素之和的平方根的平方数

norm(M, ord=2) = (1.**2  + 0.5301332**2 + 0.80512845**2)**0.5 = 1.39

为了得到特征值和奇异值之间的关系,你需要计算M^H.M的特征值,并对其进行平方根计算。

eigV = np.linalg.eigvals(M.T.dot(M))
array([1.92927303, 0.        , 0.        ])
eigV**0.5
array([1.38898273, 0.        , 0.        ])

0
投票

这是很正常的。在一般情况下,奇异值不等于特征值。只有对于正赫米特矩阵才是如此。

对于平方矩阵,你有以下关系。

M = np.matrix([[ 1., -0.5301332 , 0.80512845],
              [ 0., 0., 0.],
              [ 0., 0., 0.]])
u, v= np.linalg.eig(M.H @ M) # M.H @ M is Hermitian
print(np.sqrt(u)) # [1.38898273 0.         0.        ]
u,s,v = lin.svd(M)
print(s) # [1.38898273 0.         0.        ]

0
投票

在这种特殊情况下,2-norm的 M 与Frobenius法则重合,该法则由以下公式给出 (np.sum(np.abs(M**2)))**(1/2),因此我们可以看到。

import numpy as np

M = np.array([[ 1., -0.5301332 , 0.80512845],
              [ 0., 0., 0.],
              [ 0., 0., 0.]])

np.sqrt(np.sum(np.abs(M**2)))
1.388982732341062

np.sqrt(np.sum(np.abs(M**2))) == np.linalg.norm(M,ord=2) == np.linalg.norm(M, ord='fro')
True

特别是我们可以证明2-norm是最大特征值的平方根 M.T@M

np.sqrt(np.linalg.eigvals(M.T@M)[0])
1.388982732341062

而这是它与矩阵的特征值的关系。现在回忆一下,奇异值是M.T@M的特征值的平方根,我们解开其中的迷团。


利用Frobenius规范(M.T@M的迹值之和的平方根)的特征。

np.sqrt(np.sum(np.diag(M.T@M)))
1.388982732341062

面对结果:

np.sqrt(np.linalg.eigvals(M.T@M)[0]) == np.sqrt(np.sum(np.diag(M.T@M))) == np.linalg.svd(M)[1][0]
True
© www.soinside.com 2019 - 2024. All rights reserved.