python - 具有大值的 numpy linalg.lstsq

标签 python numpy

我正在使用 linalg.lstsq 在这样的函数内构建回归线:

def lsreg(x, y):
    if not isinstance(x, np.ndarray):
        x = np.array(x)
    if not isinstance(y, np.ndarray):
        y = np.array(y)
    A = np.array([x, np.ones(len(x))])
    ret = np.linalg.lstsq(A.T, y)
    return ret[0]

并这样调用它:

x = np.array([10000001, 10000002, 10000003])
y = np.array([3.0, 4.0, 5.0])
regress = lsreg(x, y)
fit = regress[0]*x + regress[1]
print fit

你得到的输出是:

[ 3.  4.  5.]

到目前为止,还不错。现在,如果我像这样更改 x:

x = np.array([100000001, 100000002, 100000003])
y = np.array([3.0, 4.0, 5.0])
regress = lsreg(x, y)
fit = regress[0]*x + regress[1]
print fit

我明白了

[ 3.99999997  4.00000001  4.00000005]

而不是接近 3、4 和 5 的东西。

有什么线索吗?

最佳答案

您的问题是由于求解病态方程组时出现的数值错误造成的。

In [115]: np.linalg.lstsq(A.T, y)
Out[115]: 
(array([  3.99999993e-08,   3.99999985e-16]),
 array([], dtype=float64),
 1,
 array([  1.73205084e+08,   1.41421352e-08]))

请注意,np.linalg.lstsq 为由输入矩阵形成的矩阵 AA.T 的秩返回“1”。这意味着它认为您的矩阵是等级 1,因此是病态的(因为您的最小二乘系统是 2 x 2 方程组,它应该是等级 2)。接近 0 的第二个奇异值证实了这一点。这就是“错误”结果的原因。您应该按照“数值线性代数数值错误”的思路进行谷歌搜索,以了解有关此问题的更多信息。

关于python - 具有大值的 numpy linalg.lstsq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20736255/

相关文章:

python - 尝试从引用数据帧的数据帧返回记录

python - 我可以从 CCXT API 调用获得原始交换响应吗?

python - 平均负数 python

python - python中3d数组的最大值

python - "@"运算符和 np.matmul() 之间的差异

python - 如何使用带有 NumPy 数组的矢量化来使用 Geopy 库为大型数据集计算测地线距离?

python - 在 Jython 中使用 .pyd 库

Python TIC TAC TOE 跳轮

python - Matplotlib 添加图片时调整饼图大小

python - Numpy,数组没有自己的数据?