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

标签 python scikit-learn linear-regression polynomials

在一本书中,我发现以下代码适合二次数据的线性回归:

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)

enter image description here

但这怎么可能呢?我从documentation知道PolynomialFeatures(level=2, include_bias=False) 正在创建一个如下所示的数组:

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

但是:线性回归如何拟合这些数据?意味着线性回归正在做什么以及其背后的概念是什么。

非常感谢您的解释!

最佳答案

二次多项式特征将创建一个如下所示的数组:

   [[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 维度相同的向量。

关于您评论中的问题:

  1. 此函数在新特征集中是线性的:x, x**2。只需将 x**2 视为模型中的附加功能即可。

  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是那些最小化上面总和的参数,并且这个总和涉及all中的元素行。

  • 创建向量 x**2 后,线性回归仅将其视为附加特征。您可以为其指定一个新名称 v=x**2。那么线性回归的形式为y=a+b*x+c*v,这意味着它在xv上是线性的>。该算法并不关心您如何创建v。它只是将 v 视为附加功能。
  • 关于python - 使用 PolynomialFeatures 和 LinearRegression 拟合更高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45090975/

    相关文章:

    python - 从 Numpy 数组的索引中采样的有效方法?

    python - 在 groupby 对象内的列列表上生成滚动计算的更快方法

    machine-learning - NaN 在 scikit-learn 的 OneHotEncoder 中给出 ValueError

    python - MinMaxScaler 无法正确缩放

    python - 将训练数据添加到现有的 LinearSVC

    r - 将蒙特卡罗 p 值排列成不同样本大小和方差估计量的矩阵

    r - 实现线性回归时得到 NaN

    python - 有没有更好的方法来迭代两个列表以查找 python 中项目之间的关系?

    python - 尝试同步数据库时出现类错误(Python Django)

    r - 聚合线性回归