我想为我的 5 点数据集拟合一条曲线,但它似乎不适用于 Sklearn PolynomialFeatures
i want to fit a single curve to my dataset of 5 points but it does not seem to work with Sklearn PolynomialFeatures
我想要一个 5 点的输入 (x) 和一个相同大小 (y) 的输出。之后,我应该将一条曲线拟合到数据集中。最后,我应该使用 matplotlib 绘制曲线和点以显示非线性回归。
我想为我的 5 点数据集拟合一条曲线。但它似乎不起作用。这很简单,但我是 sklearn 的新手。你知道我的代码有什么问题吗?
这是代码:
#here is the dataset of 5 points
x=np.random.normal(size=5)
y=2.2*x-1.1
y=y+np.random.normal(scale=3,size=y.shape)
x=x.reshape(-1,1)
#i use polynomialfeatures module because I want extra dimensions
preproc=PolynomialFeatures(degree=4)
x_poly=preproc.fit_transform(x)
#in this part I want to make 100 points to feed it to a polynomial and after that i can draw a curve .
x_line=np.linspace(-2,2,100)
x_line=x_line.reshape(-1,1)
#at this point i made y_hat inorder to have values of predicted y.
poly_line=PolynomialFeatures(degree=4)
x_feats=poly_line.fit_transform(x_line)
y_hat=LinearRegression().fit(x_feats,y).predict(x_feats)
plt.plot(y_hat,y_line,"r")
plt.plot(x,y,"b.")
首先,您遇到了线性回归问题。正如 joostblack 和 Arya 评论的那样,你的等式是 y=2.2x-1.1
,这是线性的。为什么需要多项式特征?
无论如何,如果您因为被要求而需要执行此任务,这里有可以工作的代码:
x=np.random.normal(size=5)
y=2.2*x-1.1
mymodel = numpy.poly1d(numpy.polyfit(x, y, 4))
myline = numpy.linspace(-2, 2, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
正如我们评论的那样,用 4 阶多项式拟合线性问题是“愚蠢的”,因为 wi 总是将线性回归作为解决方案。如果您有另一个这样的关系,它会很有用:y=x**3+x-2
(如您所见,这不是线性关系):
np.random.seed(0)
x=np.random.normal(size=5)
y=x**3+x-2
mymodel = numpy.poly1d(numpy.polyfit(x, y, 4))
myline = numpy.linspace(-2, 3, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
两个最后的评论。您必须区分什么是线性回归和多项式,在这种情况下它们很有用。其次,我用numpy来解决你的问题,而不是sklearn,它对你的问题更简单,请注意这一点。
我想要一个 5 点的输入 (x) 和一个相同大小 (y) 的输出。之后,我应该将一条曲线拟合到数据集中。最后,我应该使用 matplotlib 绘制曲线和点以显示非线性回归。 我想为我的 5 点数据集拟合一条曲线。但它似乎不起作用。这很简单,但我是 sklearn 的新手。你知道我的代码有什么问题吗? 这是代码:
#here is the dataset of 5 points
x=np.random.normal(size=5)
y=2.2*x-1.1
y=y+np.random.normal(scale=3,size=y.shape)
x=x.reshape(-1,1)
#i use polynomialfeatures module because I want extra dimensions
preproc=PolynomialFeatures(degree=4)
x_poly=preproc.fit_transform(x)
#in this part I want to make 100 points to feed it to a polynomial and after that i can draw a curve .
x_line=np.linspace(-2,2,100)
x_line=x_line.reshape(-1,1)
#at this point i made y_hat inorder to have values of predicted y.
poly_line=PolynomialFeatures(degree=4)
x_feats=poly_line.fit_transform(x_line)
y_hat=LinearRegression().fit(x_feats,y).predict(x_feats)
plt.plot(y_hat,y_line,"r")
plt.plot(x,y,"b.")
首先,您遇到了线性回归问题。正如 joostblack 和 Arya 评论的那样,你的等式是 y=2.2x-1.1
,这是线性的。为什么需要多项式特征?
无论如何,如果您因为被要求而需要执行此任务,这里有可以工作的代码:
x=np.random.normal(size=5)
y=2.2*x-1.1
mymodel = numpy.poly1d(numpy.polyfit(x, y, 4))
myline = numpy.linspace(-2, 2, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
正如我们评论的那样,用 4 阶多项式拟合线性问题是“愚蠢的”,因为 wi 总是将线性回归作为解决方案。如果您有另一个这样的关系,它会很有用:y=x**3+x-2
(如您所见,这不是线性关系):
np.random.seed(0)
x=np.random.normal(size=5)
y=x**3+x-2
mymodel = numpy.poly1d(numpy.polyfit(x, y, 4))
myline = numpy.linspace(-2, 3, 100)
plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()
两个最后的评论。您必须区分什么是线性回归和多项式,在这种情况下它们很有用。其次,我用numpy来解决你的问题,而不是sklearn,它对你的问题更简单,请注意这一点。