在书中,我发现以下代码使LinearRegression适合二次数据:

m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m, 1)
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)
lin_reg = LinearRegression()
lin_reg.fit(X_poly, y)


python - 使用PolynomialFeatures和LinearRegression拟合更高阶的函数-LMLPHP

但是那怎么可能呢?我从documentation知道PolynomialFeatures(degree=2, include_bias=False)正在创建一个看起来像这样的数组:

[[X[0],X[0]**2]
[X[1],X[1]**2]
.....
[X[n],X[n]**2]]


但是:LinearRegression如何适合此数据?意味着LinearRegression在做什么,其背后的概念是什么。

感谢您的解释!

最佳答案

阶数为2的PolynomialFeatures将创建一个类似于以下内容的数组:

   [[1, X[0], X[0]**2]
    [1, X[1], X[1]**2]
    .....
    [1, X[n] ,X[n]**2]]


我们将其称为X上方的矩阵。然后,LinearRegression寻找3个数字a,b,c,这样向量

X* [[a],[b],[c]] - Y


具有最小的均方误差(仅是上述向量中平方和的平均值)。

请注意,乘积X* [[a],[b],[c]]只是矩阵X与列向量[a,b,c].T的乘积。结果是与Y具有相同维数的向量。

关于您评论中的问题:


在新的一组功能中,此功能是线性的:x, x**2。只需将x**2视为模型中的附加功能即可。
对于问题中提到的特定数组,LinearRegression方法正在寻找将总和最小化的数字a,b,c

(a * 1 + bX [0] + cX [0] ** 2-Y [0])** 2+(a * 1 + bX [1] + cX [1] ** 2-Y [1]) ** 2 + .. +(a * 1 + bX [n] + cX [n] ** 2-Y [n])** 2


因此它将找到一组这样的数字a,b,c。因此,建议的功能y=a+b*x+c*x**2不仅仅基于第一行。相反,它基于所有行,因为选择的参数a,b,c是使上述总和最小的参数,并且该总和涉及所有行中的元素。


创建向量x**2后,线性回归只是将其视为附加功能。您可以为其赋予新名称v=x**2。然后,线性回归的形式为y=a+b*x+c*v,这意味着它在xv中是线性的。该算法并不关心您如何创建v。它将v视为附加功能。

08-20 02:04