为什么scipy的eigh会返回意外的负特征值?

时间:2017-12-26 00:02:21

标签: python numpy matrix scipy eigenvalue

当尝试使用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,让T成为{{1}的转置然后A是一个对称矩阵,具有实数,非负特征值)。但是当我输入以下35乘40矩阵时:

TA

我得到以下输出:

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

因此在我看来,正在计算负特征值。我搜索的范围很广,但类似的问题(例如12)似乎处理精确错误或所涉矩阵的不同条件。此外,在使用numpy的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 函数以及更一般的eigh函数时,我遇到了同样的问题。为什么计算产生这些负特征值,我该如何解决呢?

1 个答案:

答案 0 :(得分:0)

不幸的是,这是因为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

percusse写道:

  

已经说过这些例程已经过几十年的压力测试了   他们非常不可能窒息这个阵列。

你可以看到 - 很可能是:D