Python 二次项线性回归

Python 二次项线性回归,python,machine-learning,scikit-learn,linear-regression,Python,Machine Learning,Scikit Learn,Linear Regression,我最近一直在研究机器学习,现在用scikit和线性回归迈出了第一步 这是我的第一个样品 from sklearn import linear_model import numpy as np X = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]] y = [2,4,6,8,10,12,14,16,18,20] clf = linear_model.LinearRegression() clf.fit (X, y) print(clf.predict([

我最近一直在研究机器学习,现在用scikit和线性回归迈出了第一步

这是我的第一个样品

from sklearn import linear_model
import numpy as np

X = [[1],[2],[3],[4],[5],[6],[7],[8],[9],[10]]
y = [2,4,6,8,10,12,14,16,18,20]

clf = linear_model.LinearRegression()
clf.fit (X, y)

print(clf.predict([11]))
==> 22
输出如预期的那样
22
(显然,scikit提出了
2x
作为假设函数)。但是当我用
y=[1,4,9,16,25,36,49,64,81100]
创建一个稍微复杂一点的示例时,我的代码只是创建了疯狂的输出。我假设线性回归会得到一个二次函数(x^2),但我不知道发生了什么。11的输出现在是:
99
。所以我猜我的代码试图找到某种线性函数来映射所有的例子


在我所做的关于线性回归的教程中,有一些多项式项的例子,所以我假设scikits实现会给出正确的解决方案。我错了吗?如果是这样,我如何教SICKIT考虑二次方、三次方等。函数?

线性回归
使线性模型适合数据。在一维
X
值的情况下,结果是一条直线(即
y=a+b*X
)。对于二维值,结果是一个平面(即
z=a+b*x+c*y
)。所以你不能期望一个线性回归模型能够完美地拟合一条二次曲线:它没有足够的模型复杂度来实现这一点

也就是说,您可以巧妙地转换输入数据,以便用线性回归模型拟合二次曲线。考虑以上2D情况:

z = a + b*x + c*y
现在让我们进行替换
y=x^2
。也就是说,我们在数据中添加了第二个维度,其中包含二次项。现在我们有另一个线性模型:

z = a + b*x + c*x^2
结果是模型在
x
中是二次的,但在系数中仍然是线性的!也就是说,我们可以通过线性回归轻松地解决它:这是输入数据的基函数展开的一个示例。下面是代码:

import numpy as np
from sklearn.linear_model import LinearRegression

x = np.arange(10)[:, None]
y = np.ravel(x) ** 2

p = np.array([1, 2])
model = LinearRegression().fit(x ** p, y)
model.predict(11 ** p)
# [121]
不过,这有点尴尬,因为模型需要2D输入才能
predict()
,所以必须手动转换输入。如果希望此转换自动进行,您可以在管道中使用:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline

model = make_pipeline(PolynomialFeatures(2), LinearRegression())
model.fit(x, y).predict(11)
# [121]

这是线性模型的优点之一:使用这样的基函数展开,它们可以非常灵活,同时保持非常快的速度!您可以考虑添加带有立方、四次或其他项的列,但这仍然是一个线性回归。或者对于周期性模型,您可能会考虑添加正弦、余弦等列。在这种极端情况下,所谓的“内核技巧”允许您有效地向数据中添加无限多的新列,并最终得到一个非常强大的模型——但仍然是线性的,因此仍然相对较快!对于此类估计器的示例,请查看scikit learn。

查看和@lejlot,您必须更仔细地阅读。第一句话是:
本示例演示如何使用岭回归用n次多项式逼近函数。
本章不是关于经典插值,而是关于线性回归。谢谢!这帮了大忙。我在“model.predict(11**p)”行中得到了一个值错误,“ValueError:Expected 2D array,got 1D array:”。我使用了这行代码:model.predict([[11]]**p)