【问题标题】:Why is scipy's eigh returning unexpected negative eigenvalues?为什么 scipy 的 eigh 返回意外的负特征值?
【发布时间】:2018-06-06 22:57:31
【问题描述】:

当尝试使用 scipy 的 eigh 函数计算特定矩阵的特征值时,我得到了我不期望的负特征值。我的代码如下:

import numpy as np
from scipy import linalg

def get_symmetrized_eigens(array):
    a = np.dot(array.transpose(), array)  # Compute square matrix from the input

    evals, evecs = linalg.eigh(a)  # Compute eigenvalues, eigenvectors

    # Output to test for negative eigenvalues
    print('{0} eigenvalues computed'.format(evals.size))
    for x in evals:
        if x < 0:
            print(x)

    return evals, evecs

代码应该采用任意大小的矩阵(ndarray 格式),通过左乘其转置来生成方阵,并计算生成方阵的特征值和特征向量。在数学上,以这种方式生成的方阵的特征值必须大于或等于零(给定一个 m × n 实值矩阵A,让TA 的转置。然后TA是具有实非负特征值的对称矩阵)。但是当我输入以下 35 x 40 矩阵时:

127 127 127 127 127 127 127 127 127 127 127 125 127 128 126 118 116 128 236 253 254 254 254 253 253 254 254 254 254 254 254 254 253 253 253 253 253 253 253 254
127 127 127 127 127 127 127 127 127 127 127 126 129 121 140 116 116 116 241 255 254 254 254 253 253 253 254 254 254 254 255 254 254 254 253 253 253 253 253 254
127 127 127 127 126 125 126 128 127 123 126 125 135 191 204 116 116 116 208 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
127 127 127 126 123 127 129 125 124 129 126 169 233 252 173 116 116 116 173 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
127 127 127 127 128 129 121 130 127 141 218 254 254 252 136 116 116 116 136 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
127 127 127 124 125 124 131 125 174 243 252 253 252 237 116 116 116 116 116 239 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
127 127 127 127 127 124 130 206 250 254 252 253 254 203 116 116 119 116 116 205 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
127 127 127 126 126 138 227 253 254 254 252 254 253 169 116 116 173 116 116 170 255 255 255 255 255 255 255 255 255 255 255 255 249 245 255 255 255 255 255 255
122 117 117 119 123 152 165 174 183 190 199 208 217 132 116 117 237 117 116 132 217 209 200 192 183 175 165 156 146 137 127 118 158 238 255 255 255 255 255 255
127 127 118 116 116 116 116 116 116 116 116 116 116 116 116 147 255 147 116 116 116 116 116 116 116 116 116 116 116 116 129 209 255 255 255 255 255 255 255 255
125 126 148 170 116 116 116 116 116 116 116 116 116 116 116 185 255 184 116 116 116 116 116 116 116 116 116 116 116 173 245 255 255 255 255 255 255 255 255 255
125 143 239 252 221 139 116 116 116 116 153 189 180 172 163 226 255 226 163 172 180 189 153 116 116 116 116 139 222 255 255 255 255 255 255 255 255 255 255 255
137 238 255 255 255 251 187 119 116 116 116 164 242 255 255 255 255 255 255 255 242 164 116 116 116 119 187 251 255 255 255 255 255 255 255 255 255 255 255 255
227 254 252 255 255 255 255 232 150 116 116 116 125 201 254 255 255 255 254 201 125 116 116 116 150 232 255 255 255 255 255 255 255 255 255 255 255 255 255 255
254 252 252 255 255 255 255 255 254 199 124 116 116 116 220 255 255 255 220 116 116 116 124 199 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
254 253 252 254 254 255 255 255 255 255 220 116 116 133 253 255 239 255 253 133 116 116 221 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
254 252 253 254 255 255 255 255 255 255 181 116 116 189 255 190 117 190 255 189 116 116 181 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
252 252 254 255 255 255 255 255 255 251 127 116 117 235 167 116 116 116 167 235 117 116 127 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
253 254 253 255 255 255 255 255 255 209 116 116 143 146 116 116 116 116 116 146 142 116 116 209 252 252 252 254 253 254 253 251 255 252 251 255 255 255 255 255
254 252 254 255 255 255 255 255 255 153 116 116 116 116 116 120 177 120 116 116 116 116 116 153 253 252 254 253 253 254 252 253 251 251 253 255 255 255 255 255
254 251 253 255 255 255 255 255 235 116 116 116 116 116 129 225 255 225 129 116 116 116 116 116 235 254 251 252 254 253 254 253 254 251 253 255 255 255 255 255
253 253 254 255 255 255 255 255 184 116 116 116 116 144 240 255 255 255 240 143 116 116 116 116 181 253 253 254 254 254 253 252 253 253 250 255 255 255 255 255
250 254 253 255 255 255 255 252 129 116 116 116 163 249 255 255 255 255 255 247 162 116 116 116 121 176 241 251 254 253 254 254 253 253 254 255 255 255 255 255
253 254 252 255 255 255 255 211 116 116 116 187 255 255 255 255 255 255 255 253 252 186 116 116 116 126 151 229 250 252 252 254 254 251 254 255 255 255 255 255
254 253 255 255 255 255 255 156 116 121 209 255 255 255 255 255 255 255 255 253 253 255 207 121 116 123 125 124 190 244 253 252 253 254 253 255 255 255 255 255
254 254 255 255 255 255 238 117 132 228 255 255 255 255 255 255 255 255 255 251 253 253 254 225 121 116 128 128 123 163 225 253 254 254 253 255 255 255 255 255
255 255 255 255 255 255 186 147 242 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 149 121 124 125 129 125 133 194 252 253 253 254 255 253 254 253
255 255 255 255 255 252 181 250 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 152 127 124 127 126 130 127 125 167 228 253 250 253 253 253 253
255 255 255 255 255 252 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 152 126 126 130 123 124 125 131 124 137 199 253 251 254 252 254
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 152 126 126 125 125 127 127 125 125 128 125 171 233 254 254 254
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 152 126 126 127 127 126 125 124 125 126 127 125 142 209 254 253
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 152 126 126 127 123 128 127 128 130 123 126 126 126 127 180 239
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 152 126 126 124 129 123 126 128 124 127 127 127 123 128 127 146
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 152 126 126 126 123 128 127 124 126 128 126 126 127 125 127 124
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 254 254 152 126 126 127 127 127 127 127 127 127 127 126 127 125 126 128

我得到以下输出:

40 eigenvalues computed
-902.580414433
-829.138600111
-736.37232834
-649.343219906
-606.346570836
-542.284035259
-491.035503988
-433.836458775
-378.892895817
-349.983072146
-322.571278901
-272.422566695
-231.320418966
-215.794098609
-187.163923805
-171.74732025
-124.678786093
-83.6681245986
-36.464176635
-1.96859835522

所以在我看来,正在计算负特征值。我进行了广泛的搜索,但类似的问题(例如12)似乎涉及精度错误或所涉及矩阵的不同条件。此外,在使用 numpy 的 eigh 函数以及更通用的 eig 函数时,我也遇到了同样的问题。为什么计算会产生这些负特征值,我该如何解决?

【问题讨论】:

  • 这不太可能。可能你在输入数组时遇到了问题
  • 我通过在输入函数的数组上运行np.savetxt() 生成了我发布的数组,所以发布的是函数看到的内容。此外,我的输入有问题不会导致这个问题,因为无论我输入什么数组,从数学上讲,对称化过程必须产生一个具有非负特征向量的矩阵。我应该注意到,我在处理多个其他大小和条目不同的数组时遇到了同样的问题。
  • 话虽如此,这些例程已经经过了数十年的压力测试,因此它们在这个阵列上窒息的可能性非常小。你能发布这个的 np.array 版本吗?
  • 非常规输入的数学可能会出错。

标签: python numpy matrix scipy eigenvalue


【解决方案1】:

不幸的是,这是因为 numpy 中缺少类型控制。记住:当出现问题时 - 检查您是否使用了类似 ndarray.astype(np.int_) 而不是 ndarray.astype(np.int32)

您需要在这里传递np.float64np.int32 矩阵,而不是np.uint8 dtype。不幸的是,这些事情在 numpy 中很重要,而且它们不能轻易修复和找到......我今年在工作中遇到过几次

所以添加一行:

def get_symmetrized_eigens(array):
    array = np.array(array, dtype=np.float64)
    a = np.dot(array.transpose(), array)  # Compute square matrix from the input

打击乐写道:

话虽如此,这些例程现在已经经过了几十年的压力测试,所以 他们在这个阵列上窒息的可能性非常小。

如您所见 - 很可能 :D

【讨论】:

  • 我认为不是,考虑到eigh 返回特征值和特征向量,而eigvals 做了类似的事情,但没有返回特征向量。我认为它们之间存在的主要区别是eigh 专门用于对称(或厄米特)矩阵——事实上,为了提高效率,我可能会使用eigvalsh 而不是eigvals
  • 我运行了你的代码,所有特征值似乎都是非负的,不管矩阵的 dtype 是 int 还是 float
  • 这很奇怪...我用eigvalsh 运行代码,得到的结果与我最初发布的相同。
  • 好的,你能展示一些代码来生成原始矩阵吗?它可能很复杂? [编辑:] yeaaaaah - 当然 - 我最喜欢的 python 类型控制:D 这是因为你的矩阵 dtype 是 np.uint8。
  • 算法的数值稳定性和不能正确输入数据之间有什么关系。这就是我要求阵列版本的原因。我再重复一遍;那是非常不可能窒息的。所以正确引用;)
猜你喜欢
  • 2016-08-17
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2020-04-01
  • 1970-01-01
  • 2011-11-22
相关资源
最近更新 更多