梯度下降算法_线性回归之梯度下降算法

本文详细介绍了线性回归模型中的梯度下降算法,通过类比下山过程阐述了梯度下降的基本思想。内容包括:梯度下降的场景假设、基本过程、代价函数的最小值求解,以及单变量和多变量函数的梯度下降实例。同时,文章提到了矩阵化的线性回归计算,并指出后续将探讨正规方程方法和实际编程实现。
摘要由CSDN通过智能技术生成

8006a95358f9f4d8fa8d45662705a468.png

线性回归是由代价函数和梯度下降算法组成的,上一篇文章已经介绍过代价函数,这一篇我来介绍如何使用梯度下降算法来找到代价函数最小值。

梯度下降的场景假设:

梯度下降算法的基本思想可以类比为一个下山过程。一个人在山顶,想要下山,他无法直接看到整个山的全貌,最好的方法就是以他当前所在的位置为基准,找到下山离这个基准线最远的地方(局部最优解),然后朝这个方向下山。

梯度下降和下山类比:

梯度下降的基本过程就和下山的场景很类似。首先,我们有一个损失函数,这个函数可微,即可导。这个损失函数就代表一座山。梯度下降的目的就是获得损失函数最小值(到达山底),从而确定假设函数。现在根据下山的场景,先找到下山最陡峭的地方,然后往这个方向下山,对应到函数中,就是找到给定点的梯度,然后朝着梯度相反的方向,就能让函数值下降的最快,因为梯度的方向就是函数变化最快的方向。重复利用上述的方法,最后就能使损失函数取得局部最小值。

具体类比:

定义代价函数:J(θ0,θ1) (也可以是J(θ0,θ1,......θn))

目标:通过求得J(θ0,θ1)的最小值,获得θ0,θ1的值。

过程:1.设定一个初始的θ0,θ1的值;2.通过不断的改变θ0,θ1的值来不断的减小J(θ0,θ1)的值,直到求得J(θ0,θ1)的最小值。(使用梯度下降算法)

梯度下降算法图解:

f810393be7bd47f6e871ff5599fff707.png

图1

31b7c4ff0ce00013836c598aa3a799e0.png

图2

如上面图1,图2,随机设定一对θ0,θ1的值,然后使用梯度下降算法,设定不同的学习率,代价函数的值会在三维图像上随机找到一个方向往下下降。最终会找到代价函数的局部最优处。

梯度下降中梯度的方向:

为什么梯度的方向就是下降最快的方向呢?

考研数学复习全书上给出的梯度定义为:

a102f0fac491191b74267dc329417825.png

先说一下梯度的意义:(1) 在单变量的函数中,梯度是对这个函数的单个变量求导,代表着函数在某个给定点切线的斜率。(2) 在多变量函数中,梯度是一个向量,向量是有方向,梯度的方向指出了函数在给定点的上升最快的方向。

现在介绍一下梯度的通俗解释:在单变量函数中,它表示一个函数的变化率,然后,在函数图像中,它表示函数上某点切线的斜率。在多变量函数中,它由该函数中每个变量的偏导数组成。

对函数求导与偏导数的知识补充:

对x进行求导:

20aded8c3a80cf2be7a3e7e5e965d75e.png

对θ进行求导:

aa1e040252809404087ef3411635dc0b.png

分别关于x,y的偏导数:

对x求偏导数

840dabecf88894f1cc20176b1c3a743c.png

关于y的偏导数

58a50d0fd4359e3eb3fddf7e2ad71031.png

梯度的实际例子:

4eba3f58ce58e1bbe9856b82c1e3b397.png

将代价函数与梯度下降结合形成简单的线性回归的例子:

(1),单变量函数(代价函数)的梯度下降

7290815f5681c24d5b336d20c6a4c92b.png

对该函数求导:

cbcba5a13386278bcb7deed0faeb739c.png

初始化,θ0=1,学习率a=0.4

梯度下降算法公式:

ab8eed2223f1aa3d3267fd994fd8f8fb.png

单变量函数进行梯度下降的迭代计算过程(这里只计算含有一个θ):

1662ec7c730a36d6d03f5bcaaf342773.png

这里经过四步迭代,目的就是要找到这个代价函数的最小值。

(2),多变量函数(代价函数)的梯度下降

bf0d1fc67f0ce6f181b79bc06996302c.png

初始化,θ0=(1,3),学习率a=0.1

该多变量函数的梯度为:

aab3936179aab1afbb2112be963355e5.png

进行多次迭代:

270cb806e3b623a555c47c829b9512b9.png

该多变量函数进行迭代,会不断的靠近函数的最小值。

线性回归算

下面是梯度下降算法和线性回归模型:

2e2182ff5be6b6257fe44310dd889ec2.png

将h(x)带入到J函数中,然后求出J关于θ0,θ1的偏导数

d2fd2c2cd77f13c313402b9abf5b6098.png

将求偏导数后的代价函数方程带入到梯度下降算法中,并进行展开

1b88ffcba0c3125b2de44749060a827c.png

我们有两个变量,为了对这个公式进行矩阵化运算,我们可以给每一个点x增加一个维度,这一维的值固定为1,这一维将会与θ0相乘,这样就方便我们统一矩阵化的计算,将代价函数和梯度转换为矩阵向量相乘的形式如下:

假设函数h(x)表示为矩阵形式为

036d742d815e572958428997608bac99.png

则代价函数和对代价函数求偏导后的方程表达式为

e07a80d7d12ec33fe6264e2e1261ccc3.png

将求导后代价函数进行矩阵化并带入到线性回归方程中,便可进行矩阵化运算。

总结

以上内容通过下山的方式来类比梯度下降算法,代价函数相当于山,通过找到梯度的方向可以找到下山最快的方向,即求得代价函数的最小值。同时介绍了,如何使用矩阵的方法来进行线性回归算法的计算。

这篇文章只是介绍了线性回归整体的思路,但是没有涉及到更加详细的实际代码编程以及有关训练集特征值归一化的问题。还有就是如何直接使用正规方程的方法而不是通过迭代的方法直接求θ值。以及如何确定学习率的问题。以上这些问题,我会在后续的文章中解析。

下一篇文章我会介绍求θ值的正规方程方法,以及使用代码实现线性回归算法和正规方程方法。

好的,以下是使用Python代码对梯度下降算法实现线性回归的示例: 首先,我们需要导入所需的包: ```python import numpy as np import matplotlib.pyplot as plt ``` 然后,我们定义一个函数来计算误差,即损失函数: ```python def compute_cost(X, y, theta): m = len(y) predictions = X.dot(theta) square_err = (predictions - y) ** 2 J = 1 / (2 * m) * np.sum(square_err) return J ``` 其,X是一个m行n列的特征矩阵,y是一个m行1列的目标向量,theta是一个n行1列的参数向量,m是样本数量,n是特征数量。 接下来,我们定义一个函数来执行梯度下降算法: ```python def gradient_descent(X, y, theta, alpha, num_iters): m = len(y) J_history = np.zeros((num_iters, 1)) for i in range(num_iters): predictions = X.dot(theta) errors = np.subtract(predictions, y) delta = (alpha / m) * X.transpose().dot(errors) theta = theta - delta J_history[i] = compute_cost(X, y, theta) return theta, J_history ``` 其,alpha是学习率,num_iters是迭代次数,J_history记录了每次迭代后的损失函数值。 最后,我们可以使用上述函数来拟合一个简单的线性模型: ```python # 生成随机数据 np.random.seed(0) X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) # 对特征矩阵X添加一列全为1的向量,以便于计算截距 X_b = np.c_[np.ones((100, 1)), X] # 初始化参数向量theta theta = np.random.randn(2, 1) # 执行梯度下降算法 alpha = 0.1 num_iters = 1000 theta, J_history = gradient_descent(X_b, y, theta, alpha, num_iters) # 绘制拟合直线 plt.scatter(X, y) plt.plot(X, X_b.dot(theta), 'r') plt.show() ``` 这里我们生成了一个简单的一维数据集,然后对其进行线性回归拟合并绘制出拟合直线。 完整代码如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值