最小二乘不适用于一组 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()
我正在尝试 运行 使用 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()