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



当尝试使用 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

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

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

您需要传递np.float64np.int32矩阵,而不是在此处传递 dtypenp.uint8。不幸的是,这些事情在 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

最新更新