本文共 2560 字,大约阅读时间需要 8 分钟。
多项式回归是机器学习中的一个重要概念,它能够识别自变量与因变量之间的非线性关系。本文是关于回归、梯度下降和MSE的一系列文章中的第三篇。前两篇文章分别介绍了简单线性回归和广义线性回归的基本原理。
多项式回归是一种特殊的多元线性回归方法,它通过引入自变量的多项式形式来捕捉复杂的非线性关系。与简单线性回归不同,多项式回归允许每个自变量被表示为其他自变量的多项式形式。例如,可以将一个自变量表示为另一个自变量的平方、立方等形式。
通过多项式回归,我们可以构建一个多项式模型来拟合数据。例如,一个三阶多项式模型的形式为:
$$Y = \beta_0 + \beta_1 X_1 + \beta_2 X_1^2 + \beta_3 X_1^3 + \epsilon$$
这里,$X_0$ 是一个偏置列,允许模型包含一个常数项。通过这种形式,我们可以为每个自变量指定一个系数,从而构建一个灵活的模型。
在实际应用中,我们需要准备训练数据。可以通过随机生成的方式来创建数据集。以下是一个简单的示例:
生成数据:
import torchtorch.manual_seed(5)torch.set_printoptions(precision=2)# 偏置列X0 = torch.ones((1000, 1))# 自变量X1 = (100 * (torch.rand(1000) - 0.5)).reshape(-1, 1) # 生成-50到50之间的随机数X2 = X1 ** 2X3 = X1 ** 3X = torch.hstack((X0, X1, X2, X3))# 目标值normal = torch.distributions.Normal(loc=0, scale=8)Y = (3 * X[:, 3] + 2 * X[:, 2] + 1 * X[:, 1] + 5 + normal.sample(torch.ones(1000).shape)).reshape(-1, 1)# 数据集划分Xtrain, Xtest = X[:800], X[800:]Ytrain, Ytest = Y[:800], Y[800:]
初始化权重:
torch.manual_seed(5)w = torch.rand(size=(4, 1))
绘制最佳拟合线:
import matplotlib.pyplot as pltdef plot_lbf(): plt.scatter(Xtrain[:, 1], Ytrain, label="train") plt.scatter(Xtest[:, 1], Ytest, label="test") # 绘制最佳拟合线 X1_plot = torch.arange(-50, 50.1, 0.1).reshape(-1, 1) X2_plot, X3_plot = X1_plot ** 2, X1_plot ** 3 X0_plot = torch.ones(X1_plot.shape) X_plot = torch.hstack((X0_plot, X1_plot, X2_plot, X3_plot)) plt.plot(X1_plot.flatten(), model(w, X_plot).flatten(), color="red", zorder=4) plt.xlim(-50, 50) plt.xlabel("$X$") plt.ylabel("$Y$") plt.legend() plt.show()plot_lbf()为了最小化损失函数,我们可以使用梯度下降算法。以下是一个简单的实现:
lr = 5e-11epochs = 500000def gradient_descent(w): n = Xtrain.shape[0] return w - (lr * 2 / n) * (torch.matmul(-Ytrain.T, Xtrain) + torch.matmul(torch.matmul(w.T, Xtrain.T), Xtrain)).reshape(w.shape)for i in range(0, epochs): w = gradient_descent(w) if (i + 1) % 100000 == 0: print("epoch:", i + 1) print("weights:", w) print("Train MSE:", MSE(model(w, Xtrain), Ytrain)) print("Test MSE:", MSE(model(w, Xtest), Ytest)) print("=" * 10) plot_lbf() 正态方程是一种替代优化方法,它通过直接计算权重的最优值来避免梯度下降的慢收敛问题。其公式为:
$$w = (X^T X)^{-1} X^T Y$$
这种方法能够在有限的计算资源下快速找到最优解。
def NormalEquation(X, Y): return torch.inverse(X.T @ X) @ X.T @ Yw = NormalEquation(Xtrain, Ytrain)
通过正态方程,我们可以直接计算出最优权重。与梯度下降相比,正态方程能够更快地找到最优解,并且通常具有更低的MSE值。
通过本文的实现,我们可以看到多项式回归在处理非线性关系方面的强大能力。然而,梯度下降算法在某些情况下可能需要大量的计算资源才能收敛。正态方程提供了一种替代方案,它能够快速地找到最优解,并且通常具有更低的MSE值。
接下来的两篇文章将分别介绍套索回归和岭回归。这两种方法在机器学习领域引入了重要的概念:过拟合和正则化。通过理解这些方法,我们可以更好地理解机器学习模型的设计和优化。
转载地址:http://jbofk.baihongyu.com/