博客
关于我
Python 中的机器学习简介:多项式回归
阅读量:795 次
发布时间:2023-03-06

本文共 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/

    你可能感兴趣的文章
    Python Soc网络分析:通过使用函数迭代列表来计算机会网络
    查看>>
    python转换已转义的字符串
    查看>>
    Python Sphinx自动摘要:成员函数的自动列表
    查看>>
    Python SQL和NoSQL数据库操作实战
    查看>>
    python stdout flush_sys.stdout.flush()方法的用法
    查看>>
    python string 运算
    查看>>
    Python str与bytes之间的转换
    查看>>
    Python subprocess ffmpeg
    查看>>
    python subprocess Permission denied Errno 13
    查看>>
    Python subprocess.call - 将变量添加到 subprocess.call
    查看>>
    Python Subprocess.Popen 从一个线程
    查看>>
    Python subprocess.Popen 作为 Windows 上的不同用户
    查看>>
    Python转换PPT为PDF
    查看>>
    Python subprocess.Popen() 等待完成
    查看>>
    Python sum 二维列表中具有相同第一个值的元素
    查看>>
    Python Sympy模块NoConversion:收敛到根失败;请尝试n<;15或MaxSteps>;50
    查看>>
    Python sys.MODULES包含尚未导入的模块
    查看>>
    python sys模块使用
    查看>>
    Python tarfile、zipfile解压模块讲解
    查看>>
    python tcp server传输成功之后进行删除_python学习之路(三)使用socketserver进行ftp断点续传...
    查看>>