- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我对 scipy 的 eigh
函数返回半正定矩阵的负特征值有一些问题。下面是一个 MWE。
hess_R
函数返回半正定矩阵(它是秩一矩阵和对角矩阵的总和,两者都具有非负项)。
import numpy as np
from scipy import linalg as LA
def hess_R(x):
d = len(x)
H = np.ones(d*d).reshape(d,d) / (1 - np.sum(x))**2
H = H + np.diag(1 / (x**2))
return H.astype(np.float64)
x = np.array([ 9.98510710e-02 , 9.00148922e-01 , 4.41547488e-10])
H = hess_R(x)
w,v = LA.eigh(H)
print w
打印出的特征值是
[ -6.74055241e-271 4.62855397e+016 5.15260753e+018]
如果我在 hess_R
的返回语句中将 np.float64
替换为 np.float32
我得到
[ -5.42905303e+10 4.62854925e+16 5.15260506e+18]
相反,所以我猜这是某种精度问题。
有办法解决这个问题吗?从技术上讲,我不需要使用 eigh,但我认为这是我其他错误的根本问题(对这些矩阵求平方根,获取 NaN 等)
最佳答案
我认为问题在于您已达到浮点精度的极限。线性代数结果的一个很好的经验法则是,对于 float32,它们大约是 10^8 的一部分,对于 float 64,它们大约是 10^16 的一部分。看起来你的最小值与最大值的比率这里的特征值小于 10^-16。因此,返回值不能真正可信,并且取决于您使用的特征值实现的细节。
例如,这里有四种不同的求解器可供使用;看看他们的结果:
# using the 64-bit version
for impl in [np.linalg.eig, np.linalg.eigh, LA.eig, LA.eigh]:
w, v = impl(H)
print(np.sort(w))
reconstructed = np.dot(v * w, v.conj().T)
print("Allclose:", np.allclose(reconstructed, H), '\n')
输出:
[ -3.01441754e+02 4.62855397e+16 5.15260753e+18]
Allclose: True
[ 3.66099625e+02 4.62855397e+16 5.15260753e+18]
Allclose: True
[ -3.01441754e+02+0.j 4.62855397e+16+0.j 5.15260753e+18+0.j]
Allclose: True
[ 3.83999999e+02 4.62855397e+16 5.15260753e+18]
Allclose: True
请注意,他们都同意较大的两个特征值,但最小特征值的值在不同的实现中有所不同。尽管如此,在所有四种情况下,输入矩阵都可以重建到 64 位精度:这意味着算法可以按预期运行,达到它们可用的精度。
关于python - scipy eigh 给出正半定矩阵的负特征值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36819739/
我对 CBMutableCharacteristic 的特征值可以有多长感到困惑。如果我有一个归档对象数组,我可以将特征值设置为这个归档数组吗?或者我最好为数组中的每个归档对象设置一个单独的特征? 最
我在 Python Sympy 中使用来计算带有变量的矩阵 A 的特征值(例如)。有谁知道如何计算这样的矩阵的特征值?命令 A.eigenvals() 不起作用。例如下面的代码: x = symbol
我正在计算协方差矩阵的特征值,它是实数且对称的半正定矩阵。因此,特征值和特征向量都应该是实数,然而numpy.linalg.eig()返回具有(几乎)零虚部的复数值。 协方差矩阵太大,这里贴不出来,但
我正在尝试对图像使用光谱聚类。我首先计算亲和性矩阵,然后尝试获取特征向量。但是,在 7056x7056 矩阵上,eig() 调用花费的时间太长。关于如何改进这个的任何建议?也许我应该使用不同形式的亲和
我目前正在使用 Dart/Flutter BLE 插件来更好地了解 BLE 设备。 插件: https://pub.dartlang.org/packages/flutter_blue 当我连接到我的
我在使用 Eigen 库时遇到错误,我想做的就是从 Eigen::VectorXf 中减去一个标量。所以,我的代码如下: #define VECTOR_TYPE Eigen::VectorXf #de
假设我有一个对称矩阵 M,它不是正(半)定的,我想计算它的 k 顶(绝对值)特征值(和相应的特征向量)。现在,可以使用截断的 SVD 来做到这一点,它将返回所述特征值的绝对值,然后必须检查符号并找到相
我有一个关于 split 节点的问题。我有 4 个特征,想要预测这个人是否会玩,可能会玩,也可能不会玩。根据信息增益,我将“天气”作为第一个要分割的特征,其中“多雨”、“炎热”和“潮湿”作为分支。下雨
我有一个 ~3000x3000 类似协方差的矩阵,我在该矩阵上计算特征值-特征向量分解(它是一个 OpenCV 矩阵,我使用 cv::eigen() 来完成工作)。 但是,我实际上只需要前 30 个特
我想计算 K*es,其中 K 是一个 Eigen 矩阵(维度 pxp)和 es 是一个 px1 随机二进制 vector ,值为 1。 例如,如果 p=5 和 t=2 一个可能的 es 是 [1,0,
我正在尝试使用 CoreBluetooth 框架从设备读取所有可用服务及其特征值。 - (void)centralManager:(CBCentralManager *)central didDisc
我已经在 Internet 上多次看到这个主题,但从未见过一个完整、全面的解决方案,它可以适用于当前库版本的 sklearn 的所有用例。有人可以尝试使用以下示例解释如何实现吗? In this ex
我的输入 数据框(缩短)如下所示: >>> import numpy as np >>> import pandas as pd >>> df_in = pd.DataFrame([[1, 2, 'a
我想读取低功耗蓝牙(智能)的特征值。我不想使用 gatttool 或 btgatt-client。 d-bus 也没有帮助。我想在 Python 中执行此操作。我在以下内容中找不到任何示例: http
我是一名优秀的程序员,十分优秀!