numpy公司利纳格lstsq有很大的价值

2024-10-04 05:21:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用利纳格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]

这样称呼:

^{pr2}$

得到的输出是:

[ 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。在

有什么线索吗?在


Tags: 函数ifdefnpnotarrayfitisinstance
2条回答

我试过用西皮:

from scipy import stats

x = np.array([100000001, 100000002, 100000003])
y = np.array([3.0, 4.0, 5.0])

res = stats.linregress(x, y)
print x*res[0] + res[1]

我得到:

^{pr2}$

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

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公司返回“1”,表示根据输入矩阵形成的矩阵AA.T的秩。这意味着它认为你的矩阵是秩1,因此是病态的(因为你的最小二乘法是一个2×2的方程组,它应该是秩2)。第二个接近0的奇异值证实了这一点。这就是“错误”结果的原因。你应该沿着“数值线性代数数值错误”这条线来搜索更多关于这个问题的信息。在

相关问题 更多 >