最大特征向量及可能的Scipy奇怪行为

3 投票
2 回答
506 浏览
提问于 2025-04-17 14:19

我不太确定这是这个软件包的一个bug,还是其他原因造成的,但我来分享一下。

我正在使用一个软件包来找出一个对称矩阵(10x10大小)的最大特征值和对应的特征向量,这个矩阵是相似度分数。

scipy.sparse.linalg.eigen.arpack.eigsh

像这样:

scipy.sparse.linalg.eigen.arpack.eigsh(mymatrix, 1, which='LM')

现在我有个问题,就是当我多次运行这个代码(使用相同的矩阵、设置等等)时,有时候特征向量里的值是正的,有时候是负的(见运行3)。

有没有人知道这可能是什么原因,或者这是不是个bug?看起来没有什么规律,但这种情况只在我每次运行代码后不关闭Python时发生(也就是每次按F5运行后)。

### Run 1: ###
[[-0.31056873]
[-0.31913092]
[-0.3149287 ]
[-0.32262921]
[-0.32190688]
[-0.31292658]
[-0.32424732]
[-0.31885208]
[-0.31808024]
[-0.298174  ]]

### Run 2: ###
[[-0.31056873]
[-0.31913092]
[-0.3149287 ]
[-0.32262921]
[-0.32190688]
[-0.31292658]
[-0.32424732]
[-0.31885208]
[-0.31808024]
[-0.298174  ]]

### Run 3:###
[[ 0.31056873]
[ 0.31913092]
[ 0.3149287 ]
[ 0.32262921]
[ 0.32190688]
[ 0.31292658]
[ 0.32424732]
[ 0.31885208]
[ 0.31808024]
[ 0.298174  ]]

### Run 4: ###
[[-0.31056873]
[-0.31913092]
[-0.3149287 ]
[-0.32262921]
[-0.32190688]
[-0.31292658]
[-0.32424732]
[-0.31885208]
[-0.31808024]
[-0.298174  ]]

这不是个大问题,但我不喜欢代码里的不确定性;-)

非常感谢,

马丁

2 个回答

0

你在使用这个函数时,把 'LM' 放在了 which 参数里。用这个设置,你是在寻找绝对值最大的特征值。我注意到你这个矩阵的最小特征值和最大特征值的绝对值其实很接近。
再加上这个算法是在估算特征值,所以这就能解释你的问题了。
试试把代码里的 which 改成 'LR',这样应该能给你返回最大的实数特征值(反正你的特征值都是实数)。

7

这其实是个数学问题。

原因在于,当你计算特征向量时,会出现一个任意的相位。你在解方程 Ax = bx 来找 x。这个方程在乘以一个(可能是复杂的)相位时是不会改变的。

至于为什么会以(看起来)随机的方式发生,我不太清楚。不过我很确定这不是个错误。

撰写回答