最小二乘不适用于一组 y

Least squares not working for a set of y's

我正在尝试 运行 使用 numpy 的最小二乘算法,但遇到了问题。有人可以告诉我我在给定代码中做错了什么吗?当我将 y 设置为 y = np.power(X, 1) + np.random.rand(20)*3 或 x 的其他一些合理函数时,一切正常。但是对于由那些给定的 y 值定义的特定 y,我得到的图是毫无意义的。

这是某种数值问题吗?

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

X = np.arange(1,21)
y = np.array([-0.00454712, -0.00457764, -0.0045166 , -0.00442505, -0.00427246,
       -0.00411987, -0.00378418, -0.003479  , -0.00314331, -0.00259399,
       -0.00213623, -0.00146484, -0.00082397, -0.00030518,  0.00027466,
        0.00076294,  0.00146484,  0.00192261,  0.00247192,  0.00314331])

#y = np.power(X, 1) + np.random.rand(20)*3

w = np.linalg.lstsq(X.reshape(20, 1), y)[0]

plt.plot(X, y, 'red')
plt.plot(X, X*w[0], 'blue')
plt.show()

你确定你拟合的和y变量数据是线性关系吗?

使用您的示例中的代码 (y = np.power(X, 1) + np.random.rand(20)*3),您在 y 变量本身(带有一些噪声)中建立了线性关系,这使您的绘图能够相对较好地跟踪线性方程。

X = np.arange(1,21)

#y = np.power(X, 1) + np.random.rand(20)*3

w = np.linalg.lstsq(X.reshape(20, 1), y)[0]

plt.plot(X, y, 'red')
plt.plot(X, X*w[0], 'blue')
plt.show()

但是,当您替换为 y 变量之类的东西时

    y = np.array([-0.00454712, -0.00457764, -0.0045166 , -0.00442505, -0.00427246,
       -0.00411987, -0.00378418, -0.003479  , -0.00314331, -0.00259399,
       -0.00213623, -0.00146484, -0.00082397, -0.00030518,  0.00027466,
        0.00076294,  0.00146484,  0.00192261,  0.00247192,  0.00314331])    

你最终得到了一些不太容易适应的东西。

查看 documentation,如果您正在尝试符合这组值的内容,您将需要构建常量组件,在这种情况下 lstsq 默认情况下不会执行。 lstsq

的文档状态

Return the least-squares solution to a linear matrix equation.

Solves the equation a x = b

如果您真的想用线性方程拟合数据,运行 下面的代码将为您提供几乎与原始数据匹配的结果。然而,这个过程背后的数据似乎有 polynomial/exponential 驱动程序,这将使 polyfit 更好。

X = np.arange(1,21)
y = np.array([-0.00454712, -0.00457764, -0.0045166 , -0.00442505, -0.00427246,
       -0.00411987, -0.00378418, -0.003479  , -0.00314331, -0.00259399,
       -0.00213623, -0.00146484, -0.00082397, -0.00030518,  0.00027466,
        0.00076294,  0.00146484,  0.00192261,  0.00247192,  0.00314331])

#y = np.power(X, 1) + np.random.rand(20)*3
X2 = np.vstack([X, np.ones(len(X))]).T
w = np.linalg.lstsq(X2, y)[0]


plt.plot(X, y, 'red')
plt.plot(X, X.dot(w[0])+w[1], 'blue')
plt.show()