• 线性回归的梯度下降法——机器学习


    一、实验内容


    1. 理解单变量线性回归问题;
    2. 理解最小二乘法;
    3. 理解并掌握梯度下降法的数学原理;
    4. 利用python对梯度下降法进行代码实现;

    二、实验过程


    1、算法思想


            梯度下降法是一阶最优化算法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。

            最小二乘法也叫做最小平方法,它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最小二乘法来表达。

    2、算法原理


            梯度下降法是迭代法的一种,可以用于求解最小二乘问题。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降法和最小二乘法是最常采用的方法。

            在求解损失函数的最小值时,可以通过梯度下降法来迭代求解,得到最小化的损失函数和模型参数值。

    3、算法分析


    (1)确定当前位置的损失函数的梯度,对于,其梯度表达式为:

    (2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即。

    (3)确定是否所有的梯度下降的距离都小于,如果小于则算法终止,当前所有的

    即为最终结果。否则进入第(4)步。

    (4)更新所有的,更新表达式如下,更新完成后转入步骤(1):

    三、源程序代码


    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. from mpl_toolkits.mplot3d import Axes3D
    4. # 求fx的函数值
    5. def fx(x, y):
    6. return (x - 10) ** 2 + (y - 10) ** 2
    7. def gradient_descent():
    8. times = 100 # 迭代次数
    9. alpha = 0.05 # 学习率
    10. x = 20 # x的初始值
    11. y = 20 # y的初始值
    12. fig = Axes3D(plt.figure()) # 将画布设置为3D
    13. axis_x = np.linspace(0, 20, 100) # 设置X轴取值范围
    14. axis_y = np.linspace(0, 20, 100) # 设置Y轴取值范围
    15. axis_x, axis_y = np.meshgrid(axis_x, axis_y) # 将数据转化为网格数据
    16. z = fx(axis_x, axis_y) # 计算Z轴数值
    17. fig.set_xlabel('X', fontsize=14)
    18. fig.set_ylabel('Y', fontsize=14)
    19. fig.set_zlabel('Z', fontsize=14)
    20. fig.view_init(elev=60, azim=300) # 设置3D图的俯视角度,方便查看梯度下降曲线
    21. fig.plot_surface(axis_x, axis_y, z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow')) # 作出底图
    22. for i in range(times):
    23. x1 = x
    24. y1 = y
    25. f1 = fx(x, y)
    26. print("第%d次迭代:x=%f,y=%f,fxy=%f" % (i + 1, x, y, f1))
    27. x = x - alpha * 2 * (x - 10)
    28. y = y - alpha * 2 * (y - 10)
    29. f = fx(x, y)
    30. fig.plot([x1, x], [y1, y], [f1, f], 'ko', lw=2, ls='-')
    31. plt.show()
    32. if __name__ == "__main__":
    33. gradient_descent()

    四、运行结果分析


    五、实验总结


     

    线性回归求解可以使用最小二乘法梯度下降法,下面我们针对两种方法进行对比:

    相同点:本质和目标相同,两种都是经典的学习算法,在给定已知数据的情况下,利用求导算出一个模型(函数),使得损失函数最小,然后对给定的新数据进行估算预测。

    不同点:

    损失函数的选择:最小二乘法必须使用平方损失函数,而梯度下降可以选取其它函数;

    实现方法不同,最小二乘法是实现全局最小,而梯度下降是一种迭代法;

    一般最小二乘法一定可以得到全局最小,但对于多元计算繁琐,且复杂情况下未必有解。

    而梯度下降的迭代比较简单,但找到的一般是局部最小,即极小值,仅在目标函数是下凸函数是才是全局最小,到最小点的收敛速度会变慢,且对初始点的选择极为敏感,而且步长的选择对损失函数也有影响。

     

  • 相关阅读:
    【Ubuntu】安装企业微信(Wine)
    JS语法杂记
    orb-slam2 从单目开始的简单学习(8):LocalMapping
    Python3 如何获取照片的 Exif 信息?
    SpringBoot SpringBoot 运维实用篇 2 配置高级 2.1 临时属性
    Increment Selection 插件
    C++对象模型(14)-- 构造函数语义学:拷贝构造函数和赋值运算赋
    从面试官角度分析:面试功能测试工程师主要考察哪些能力?
    软件工程开发和文档流程(及概要设计+详细设计)
    计算机网络分层
  • 原文地址:https://blog.csdn.net/qq_50942093/article/details/128007034