梯度下降算法

目录

 一、摘要

二、梯度下降法原理解析

(一)梯度下降算法的浅层解析

(二)梯度下降法中的重要概念

(三)梯度下降算法原理详解 

1、代数法

2、向量法(矩阵法)

 三、梯度下降法的分类与对比

(一)批量梯度下降法(BGD)

(二)随机梯度下降法(SGD)

(三)小批量梯度下降算法(MBGD)

 四、总结

(一)梯度下降法存在的问题

(二)梯度下降法优化算法简介

1、AdaGrad ——动态学习率

2、RMSProp——优化动态学习率算法

3、Momentum——动量算法

4、Adam算法

五、视频讲解

六、代码实现 

(一)实例一:线性回归问题(一元一次函数)

(二)实例二(一元二次函数)

(三)城市人口数量与饭店利润实例 


 一、摘要

        梯度下降法是一种求解最优化的算法。其中心思想是沿着目标函数梯度的方向更新参数值以希望达到目标函数最小。机器学习在学习简单的线性回归时,常常使用最小二乘法求解损失函数的最小值。但在绝大多数情况下,损失函数都是非线性的,并且较为复杂。所以梯度下降法也常被用在机器学习领域。

        目前,许多优秀的算法都是在梯度下降算法的启发下诞生,如AdaGrad、RMSProp、Momentum等等,在后文中,我们会以机器学习的简单实例对梯度下降法进行详细解析,通过两种方式解释原理公式,分别是代数法和矩阵法。代数法不需要线性代数基础,便于理解。但因为机器学习中输入数据大多为向量或张量(多维矩阵),所以这里也提供了矩阵法进行公式解析,需要线性代数的基础知识。

二、梯度下降法原理解析

(一)梯度下降算法的浅层解析

        在浅析梯度下降法时,我们可以想象我们身处高山上的某一处位置,而梯度下降法,就是帮助我们得到到达山底的方法。当我们不知道自身所处在山的具体位置时,我们可以通过查看最陡峭的下坡路寻找到最快到达山底的路,每走一段距离,我们将重新测试山坡的梯度。通过迭代的方式(反复测量和行走)直到到达山底,显然这就是下山的最短路径。

        通过这个生动的例子,在机器学习中我们可以将我们在山上的初始位置当作是输入到预测函数的初始值,同时也对应了损失函数上的某个起始点。山体的陡峭程度则是梯度,对应于损失函数的导数或偏导数。以测量最陡路径次数作为迭代次数,那么在一次迭代中所走的下坡路的路径(即步长)则与学习率密切相关(后面会有公式)。通过一定次数的迭代,当我们走到山脚时,如果此山峰只有山脚这一个低谷,那么这个山脚就对应于损失函数的最小值。如下图所示。所以梯度下降法的目的就是寻找到损失函数的最小值

        如果损失函数是凸函数,那么最小值对应的就是山脚,但从图中不难看出,我们认为的最小值有可能只是极小值之一,也称局部最优点,就比如是在一个局部的山峰低处,而不是山脚。解决的方法属于较为复杂的梯度下降法的衍生算法,本文会在总结部分进行简单说明。

(二)梯度下降法中的重要概念

        在本文详细讲解梯度算法之前,我们先了解梯度算法中的一些常见的重要概念。

        1、预测函数(Prediction function):在机器学习中,为了拟合样本而采用预测函数。例如线性回归表达式中Y=W_{i}X+B(W_{i}=W_{1},W_{2},W_{3}...W_{n})W_{i}表示权重,Y表示输出值,也即预测值。而X表示输入值,也即样本特征值。B在此处称为截距项,目的在于防止训练出的模型必定通过原点,提升模型的适用范围。
        2、损失函数(Loss function):损失函数用于评估训练出的模型的拟合程度。损失函数越大,意味着模型拟合效果越差。在机器学习中,梯度下降法的根本目的是在迭代中寻找损失函数的最小值,并通过反向传播的方式调整各个权重的大小,直到模型拟合程度达到指定要求。
        3、步长(Learning rate):步长决定了在梯度下降的过程中沿梯度负方向移动的距离,也就是对应于上文中所提到的两次测量最陡路径之间的距离,在机器学习中也被成为学习率

(三)梯度下降算法原理详解 

         本文将用代数法和和向量法(矩阵法)两种方式解析梯度下降算法。

1、代数法

第一步:确认预测函数。

        本例设定的预测函数为Y\left ( X_{1},X_{2},...,X_{N} \right )=W_{1}X_{1}+W_{2}X_{2}+...+W_{N}X_{N}+B(其中W为模型参数)。如果加入特征项B,此处B的作用如预测函数作用中所描述的那样。此处我们就可以将预测函数归结为Y=

第二步:确认损失函数。

        确定了预测函数之后,此处使用均方损失函数。在该训练数据集给定的情况下,损失函数的大小仅与参数W_{i},B有关。所以我们设置损失函数为。其中Y_{i}表示预测值,Y表示标准值(实际值)。在1/2N中,1/2的目的在于对L进行求导时使得导数的系数为1,因为N代表输入个数并且已知,所以此处1/2N是求损失函数损失数值的平均值。

第三步:初始化参数。

        上式中我们设置初始化参数W_{i}设置为1,步长为0.1。这些参数会在后续的迭代中不断进行优化。

第四步:进行梯度下降计算。

        ①确定损失函数的梯度表达式:确定了损失函数之后,我们将确定损失函数的梯度。也就是损失函数的倒数或者偏导数。对于W_{i}来说,其梯度表达式为:,对于B来说,其梯度表达式为:
        ②确定移动距离,并且更新参数:此处确定的移动距离表示在本轮迭代中的减少量。移动距离为步长(学习率)与损失梯度的乘积,即学习率*梯度。与此同时更新参数W_{i}(权重),B(截距项)。公式表示如下:W_{i} = W_{i} - ,。此处a为步长(学习率),m为传入参数的样本个数,累加的对象是各个参数对W_{i}的偏导数。因为梯度下降法中传入参数可能是全部,也可能是传入小批量,又或者是一个。这三种情况即对应本文下文所述的梯度下降法的三种分类方式,此处不展开详细说明。从此处不难看出,样本梯度的方向是由传入的所有样本参数共同决定的,并且以预测值与样本拟合度达到要求作为迭代结束的标准。

2、向量法(矩阵法)

        向量法的基本思路与代数法基本相同,但此处输出,输入,参数(权重),截距项均为矩阵(向量)。相对于代数法,矩阵法的公式更加简介,也更容易理解。

 第一步:确认预测函数:

        预测函数可设置为。我们假设线性回归模型输出的形状大小为Y∈,样本特征值X∈,权重形状大小W∈,偏置项B∈ 。

 第二步:确认损失函数:

        此处我们将代数方法中的损失函数进行向量化。。将上式中特征矩阵X上增加一个全为1的列向量,并且定义为。所以损失函数即可化简为。此处

第三步:进行梯度计算:

        将化简后的损失函数求梯度,即求偏导数可得:令偏导数为0可解出:=。最后我们进行一次迭代之后的参数更新,。同理,迭代的停止条件为输入值在误差允许的范围之内。 

 三、梯度下降法的分类与对比

        在代数法中使用梯度下降法求解损失函数的最小值的时候,m为传入的样本数。本文将以传入函数的样本数为变量将梯度下降法分为最基本的三种情况。三种情况分别为批量梯度下降(Batch Gradient Descent,BGD)、随机梯度下降(Stochastic Gradient Descent, SGD)、小批量梯度下降(Mini-Batch Gradient Descent, MBGD)。

(一)批量梯度下降法(BGD)

        批量梯度下降法在每次都使用训练集中的所有样本来更新参数,代数法表达式为:

优点:
(1)每次迭代过程是对所有样本进行计算,此时利用矩阵进行操作,实现了并行。
(2)通过数据集所有样本确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。当目标函数为凸函数时,BGD一定能够得到全局最优。
缺点:
(1)当样本数目 m 很大时,每迭代一步都需要对所有样本计算,训练过程会很慢。
从迭代的次数上来看,BGD迭代的次数相对较少。其迭代的收敛曲线示意图可以表示如下:

(二)随机梯度下降法(SGD)

        随机梯度下降法每次迭代随机选取一个样本带入计算,使得每次迭代计算所耗费的时间较短。代数法表达式为。 

优点:
(1)每次迭代带入参数少,迭代更新参数的速度大大加快。
缺点:
(1)因为每次迭代更新参数时所选样本数量为1,导致精度下降。即使是凸函数也难以找到最优解

(2)难以并行实现

其迭代时的曲线示意图如下图所示:

(三)小批量梯度下降算法(MBGD)

        小批量梯度下降法则是在每次迭代中传入固定小批量的样本,这也是梯度下降法中使用较为广泛的一种方法,它介于批量梯度下降算法与随机梯度下降算法之间。现在通常将它们简单地成为随机(stochastic)方法。对于深度学习模型而言,人们所说的“随机梯度下降, SGD”,其实就是基于小批量(mini-batch)的随机梯度下降。

优点:

(1)计算速度比批量梯度下降算法快,每次迭代时传入部分样本进行参数的更新。

(2)在小批量选取样本时,我们可以将对参数更新影响效果较为相近的样本分为等价类,舍弃部分贡献较小的样本。

(3)每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。

缺点:

(1)在迭代的过程中,因为噪音的存在,学习过程会出现波动。因此,它在最小值的区域徘徊,不会收敛。

(2)BATCH SIZE选择不当会影响收敛结果。

其收敛曲线示意图如下:

 四、总结

(一)梯度下降法存在的问题

        梯度下降法简单有效,适用范围广,但也并非完美无缺。比如在开篇时举例中提到的问题,当损失函数不是凸函数时,梯度下降法法所寻找的可能是极小值,也就是局部最优点。还有一个较为凸出的问题,就是学习率的设定,也就是步长的选择。如果学习率设定过大,计算结果会在迭代中的坐标轴上反复横跳。学习率设置过小又会产生较大的计算量。

(二)梯度下降法优化算法简介

1、AdaGrad ——动态学习率

        该算法的思想是独立地适应模型的每个参数:具有较大偏导数的参数相应有一个较大的学习率,而具有小偏导数的参数则对应一个较小的学习率。这种方法的一个问题是频繁更新参数的学习率有可能会过小,以至逐渐消失。为了解决这个问题,又涌现出RMSProp ——优化动态学习率算法,以及不需要设置参数的AdaDelta算法,还有融合了RMSProp算法和AdaDelta算法的Momentum算法。

2、RMSProp——优化动态学习率算法

        RMSProp算法主要解决了AdaGrad中学习率过度衰减的问题。RMSProp 通过使用指数衰减平均(递归定义)以丢弃遥远的历史,使其能够在找到某个“凸”结构后快速收敛;

3、Momentum——动量算法

        动量算法,故名思义就是在寻找全局最优点的时候为点加上动量,是一种带动量的SGD方法。在SGD中,如果我们将下山的人比喻成纸团,那么纸团的质量小,碰撞到山壁时来回震荡较大,并且到达半山腰的平地时速度容易降为0而停止运动。Momentum算法就是在SGD的基础上将纸团换成铁球,那么铁球在下山的过程中因为碰撞所受到的震荡较小,在遇到平地时因为动量较大,离开平地继续下降的机率大大提升。

4、Adam算法

        Adam 是一种可以替代传统随机梯度下降(SGD)过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重。Adam 最开始是由 OpenAI 的 Diederik Kingma 和多伦多大学的 Jimmy Ba 在提交到 2015 年 ICLR 论文(Adam: A Method for Stochastic Optimization)中提出的。        

        Adam 算法和传统的随机梯度下降不同。随机梯度下降保持单一的学习率(即 alpha)更新所有的权重,学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率 Adam 算法的提出者描述其为两种随机梯度下降扩展式的优点集合,即:

适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。

均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能。

        Adam 算法同时获得了 AdaGrad 和 RMSProp 算法的优点。Adam 不仅如 RMSProp 算法那样基于一阶矩均值计算适应性参数学习率,它同时还充分利用了梯度的二阶矩均值(即有偏方差/uncentered variance)。具体来说,算法计算了梯度的指数移动均值(exponential moving average),超参数 beta1 和 beta2 控制了这些移动均值的衰减率。移动均值的初始值和 beta1、beta2 值接近于 1(推荐值),因此矩估计的偏差接近于 0。该偏差通过首先计算带偏差的估计而后计算偏差修正后的估计而得到提升。

五、视频讲解

视频讲解:

简单易懂的梯度下降算法讲解,带你简单入门_哔哩哔哩_bilibili

[5分钟深度学习] #01 梯度下降算法_哔哩哔哩_bilibili

六、代码实现 

(一)实例一:线性回归问题(一元一次函数)

线性回归问题其实就是寻找一条合适的直线(y=ωx)用以表示所有的数据点,如下:

如上图所示,线性回归问题其实就是求解上面的线性函数中最佳的ω值。合适y=ωx函数可以表示标签Y和数据X之间的关系,进而预测新的x所对应的预测值Yprei,其中Yprei=ωXi。那么我们应当用什么来衡量最佳的ω值呢?

我们一般认为预测值Yprei与真实值yi的距离越小,那么该函数就越好,ω的值就越趋近于最佳。在机器学习中,这种计算距离的函数有一个名字,叫做损失函数。定义如下:

import numpy as np

# 所有点的预测值和实际值的距离的平方和,再取平均值(这种距离叫做欧氏距离)。
def loss(y, y_pred):
    return ((y_pred - y) ** 2).mean()

# 测试代码
y_pred = np.array([1, 2])
y = np.array([1, 1])
print(loss(y, y_pred))

输出结果如下: 

0.5

根据梯度和当前位置更新下一次所在位置的数学表达式如下:

上面式子展示了损失函数J(θ)的最小值的求解过程。其中θ0表示当前所在位置,θ1表示下一步的位置,α表示步长(即一次更新的距离),∇J(θ0) 表示损失函数的梯度。我们可以将损失函数值J定义为欧氏距离,如下:损失函数关于ω的梯度为:

 根据上面的梯度公式,让我们来定义损失函数的梯度计算公式:

#返回dJ/dw
def gradient(x, y, w):
    return np.mean(2*w*x*x-2*x*y)
## 测试代码
x = np.array([1,2])
y = np.array([1,1])
gradient(x, y, 2)

 输出结果如下: 

 7.0

假设 w 为损失函数需要求的变量,那么梯度下降算法的具体步骤如下:

1.随机初始化一个ω的值。
2.在该ω下进行正向传播,得到所有x的预测值Ypre。
3.通过实际的值y和预测值Ypre计算损失。
4.通过损失计算梯度dw。
5.更新ω:ω−lr⋅dω,其中lr为步长,可自定义具体的值。
6.重复步骤 2−5,直到损失降到较小位置。
首先,让我们先来定义一下梯度下降算法所需要的数据集和变量值:

# 正向传播,计算预测值
def forward(x):
    return w * x
# 定义数据集合和 w 的初始化
X = np.array([1, 2, 3, 4], dtype=np.float32)
Y = np.array([2, 4, 6, 8], dtype=np.float32)
w = 0.0
# 定义步长和迭代次数
learning_rate = 0.01
n_iters = 20

接下来,让我们根据上面步骤,利用梯度下降算法求解一元回归函数中的ω的值: 

for epoch in range(n_iters):
    y_pred = forward(X)
    #计算损失
    l = loss(Y, y_pred)
    #计算梯度
    dw = gradient(X, Y, w)
    #更新权重 w
    w -= learning_rate * dw

    if epoch % 2 == 0:
        print(f'epoch {epoch+1}: w = {w:.3f}, loss = {l:.8f}')
     
print(f'根据训练模型预测,当 x =5 时,y 的值为: {forward(5):.3f}')

输出结果如下:

epoch 1: w = 0.300, loss = 30.00000000
epoch 3: w = 0.772, loss = 15.66018677
epoch 5: w = 1.113, loss = 8.17471600
epoch 7: w = 1.359, loss = 4.26725292
epoch 9: w = 1.537, loss = 2.22753215
epoch 11: w = 1.665, loss = 1.16278565
epoch 13: w = 1.758, loss = 0.60698175
epoch 15: w = 1.825, loss = 0.31684822
epoch 17: w = 1.874, loss = 0.16539653
epoch 19: w = 1.909, loss = 0.08633806
根据训练模型预测,当 x =5 时,y 的值为: 9.612

从结果可以很清晰的看到,我们利用梯度下降算法,不断的降低损失的值,寻找最佳的权重ω。当损失不再发生变化时,证明我们已经找到了一个较小的值,此时的ω就是较佳权重(根据结果可以看到,ω的值无限接近于 2)。即线性函数y=2x可以很好的表示上面的数据集合。

(二)实例二(一元二次函数)

有一个目标函数,f(x)=x^{2} ,一元函数的导数就是该曲线某一点切线的斜率,导数越大,该点的斜率越大,下降越快F ′ = 2 x 这就是梯度,r_{k}控制着梯度下降前进距离,太大太小都不行。

import numpy as np
import matplotlib.pyplot as plt


# 定义目标函数 f(x)=x**2+1
def f(x):
    return np.array(x)**2 + 1

# 对目标函数求导 d(x)=x*2
def d1(x):
    return x * 2

def Gradient_Descent_d1(current_x = 0.1,learn_rate = 0.01,e = 0.001,count = 50000):
    # current_x initial x value
    # learn_rate 学习率
    # e error
    # count number of iterations
    for i in range(count):
        grad = d1(current_x) # 求当前梯度
        if abs(grad) < e: # 梯度收敛到控制误差内
            break # 跳出循环
        current_x = current_x - grad * learn_rate # 一维梯度的迭代公式
        print("第{}次迭代逼近值(梯度)为{}".format(i+1,current_x))

    print("最小值为:",current_x)
    print("最小值保存小数点后6位:%.6f"%(current_x))
    return current_x

# 显示目标函数曲线及梯度下降最小值毕竟情况
def ShowLine(min_X,max_Y):
    x = [x for x in range(10)] + [x * (-1) for x in range(1,10)]
    x.sort()
    print(x)
    plt.plot(x,f(x))
    plt.plot(min_X,max_Y,'ro')
    plt.show()

minValue = Gradient_Descent_d1(current_x = 0.1,learn_rate = 0.01,e = 0.001,count = 50000)
minY = f(minValue)
print('目标函数最小值约为:',minY)
ShowLine(minValue,minY)

 结果输出如下:

第1次迭代逼近值(梯度)为0.098
第2次迭代逼近值(梯度)为0.09604
第3次迭代逼近值(梯度)为0.0941192
第4次迭代逼近值(梯度)为0.092236816
第5次迭代逼近值(梯度)为0.09039207968
第6次迭代逼近值(梯度)为0.08858423808640001
第7次迭代逼近值(梯度)为0.08681255332467201
第8次迭代逼近值(梯度)为0.08507630225817857
第9次迭代逼近值(梯度)为0.08337477621301499
第10次迭代逼近值(梯度)为0.08170728068875469
第11次迭代逼近值(梯度)为0.0800731350749796
第12次迭代逼近值(梯度)为0.07847167237348
第13次迭代逼近值(梯度)为0.0769022389260104
第14次迭代逼近值(梯度)为0.0753641941474902
第15次迭代逼近值(梯度)为0.07385691026454039
第16次迭代逼近值(梯度)为0.07237977205924959
第17次迭代逼近值(梯度)为0.0709321766180646
第18次迭代逼近值(梯度)为0.06951353308570331
第19次迭代逼近值(梯度)为0.06812326242398924
第20次迭代逼近值(梯度)为0.06676079717550945
第21次迭代逼近值(梯度)为0.06542558123199926
第22次迭代逼近值(梯度)为0.06411706960735927
第23次迭代逼近值(梯度)为0.06283472821521209
第24次迭代逼近值(梯度)为0.061578033650907846
第25次迭代逼近值(梯度)为0.06034647297788969
第26次迭代逼近值(梯度)为0.059139543518331894
第27次迭代逼近值(梯度)为0.05795675264796526
第28次迭代逼近值(梯度)为0.056797617595005956
第29次迭代逼近值(梯度)为0.05566166524310584
第30次迭代逼近值(梯度)为0.05454843193824372
第31次迭代逼近值(梯度)为0.05345746329947885
第32次迭代逼近值(梯度)为0.05238831403348927
第33次迭代逼近值(梯度)为0.05134054775281949
第34次迭代逼近值(梯度)为0.050313736797763096
第35次迭代逼近值(梯度)为0.04930746206180783
第36次迭代逼近值(梯度)为0.04832131282057168
第37次迭代逼近值(梯度)为0.047354886564160245
第38次迭代逼近值(梯度)为0.046407788832877044
第39次迭代逼近值(梯度)为0.0454796330562195
第40次迭代逼近值(梯度)为0.04457004039509511
第41次迭代逼近值(梯度)为0.0436786395871932
第42次迭代逼近值(梯度)为0.04280506679544934
第43次迭代逼近值(梯度)为0.041948965459540355
第44次迭代逼近值(梯度)为0.041109986150349546
第45次迭代逼近值(梯度)为0.040287786427342556
第46次迭代逼近值(梯度)为0.0394820306987957
第47次迭代逼近值(梯度)为0.03869239008481979
第48次迭代逼近值(梯度)为0.03791854228312339
第49次迭代逼近值(梯度)为0.03716017143746093
第50次迭代逼近值(梯度)为0.036416968008711706
第51次迭代逼近值(梯度)为0.035688628648537474
第52次迭代逼近值(梯度)为0.034974856075566725
第53次迭代逼近值(梯度)为0.03427535895405539
第54次迭代逼近值(梯度)为0.03358985177497428
第55次迭代逼近值(梯度)为0.032918054739474796
第56次迭代逼近值(梯度)为0.0322596936446853
第57次迭代逼近值(梯度)为0.03161449977179159
第58次迭代逼近值(梯度)为0.03098220977635576
第59次迭代逼近值(梯度)为0.030362565580828647
第60次迭代逼近值(梯度)为0.029755314269212074
第61次迭代逼近值(梯度)为0.029160207983827832
第62次迭代逼近值(梯度)为0.028577003824151275
第63次迭代逼近值(梯度)为0.028005463747668248
第64次迭代逼近值(梯度)为0.027445354472714883
第65次迭代逼近值(梯度)为0.026896447383260587
第66次迭代逼近值(梯度)为0.026358518435595377
第67次迭代逼近值(梯度)为0.025831348066883468
第68次迭代逼近值(梯度)为0.0253147211055458
第69次迭代逼近值(梯度)为0.024808426683434883
第70次迭代逼近值(梯度)为0.024312258149766185
第71次迭代逼近值(梯度)为0.02382601298677086
第72次迭代逼近值(梯度)为0.023349492727035442
第73次迭代逼近值(梯度)为0.02288250287249473
第74次迭代逼近值(梯度)为0.022424852815044836
第75次迭代逼近值(梯度)为0.02197635575874394
第76次迭代逼近值(梯度)为0.02153682864356906
第77次迭代逼近值(梯度)为0.02110609207069768
第78次迭代逼近值(梯度)为0.020683970229283727
第79次迭代逼近值(梯度)为0.020270290824698053
第80次迭代逼近值(梯度)为0.019864885008204092
第81次迭代逼近值(梯度)为0.01946758730804001
第82次迭代逼近值(梯度)为0.019078235561879212
第83次迭代逼近值(梯度)为0.01869667085064163
第84次迭代逼近值(梯度)为0.018322737433628795
第85次迭代逼近值(梯度)为0.017956282684956217
第86次迭代逼近值(梯度)为0.017597157031257093
第87次迭代逼近值(梯度)为0.017245213890631952
第88次迭代逼近值(梯度)为0.016900309612819315
第89次迭代逼近值(梯度)为0.01656230342056293
第90次迭代逼近值(梯度)为0.01623105735215167
第91次迭代逼近值(梯度)为0.015906436205108634
第92次迭代逼近值(梯度)为0.015588307481006461
第93次迭代逼近值(梯度)为0.015276541331386333
第94次迭代逼近值(梯度)为0.014971010504758606
第95次迭代逼近值(梯度)为0.014671590294663434
第96次迭代逼近值(梯度)为0.014378158488770165
第97次迭代逼近值(梯度)为0.014090595318994762
第98次迭代逼近值(梯度)为0.013808783412614867
第99次迭代逼近值(梯度)为0.01353260774436257
第100次迭代逼近值(梯度)为0.013261955589475318
第101次迭代逼近值(梯度)为0.012996716477685811
第102次迭代逼近值(梯度)为0.012736782148132095
第103次迭代逼近值(梯度)为0.012482046505169453
第104次迭代逼近值(梯度)为0.012232405575066064
第105次迭代逼近值(梯度)为0.011987757463564744
第106次迭代逼近值(梯度)为0.01174800231429345
第107次迭代逼近值(梯度)为0.01151304226800758
第108次迭代逼近值(梯度)为0.01128278142264743
第109次迭代逼近值(梯度)为0.01105712579419448
第110次迭代逼近值(梯度)为0.01083598327831059
第111次迭代逼近值(梯度)为0.010619263612744378
第112次迭代逼近值(梯度)为0.01040687834048949
第113次迭代逼近值(梯度)为0.010198740773679701
第114次迭代逼近值(梯度)为0.009994765958206107
第115次迭代逼近值(梯度)为0.009794870639041985
第116次迭代逼近值(梯度)为0.009598973226261145
第117次迭代逼近值(梯度)为0.009406993761735923
第118次迭代逼近值(梯度)为0.009218853886501205
第119次迭代逼近值(梯度)为0.009034476808771182
第120次迭代逼近值(梯度)为0.008853787272595759
第121次迭代逼近值(梯度)为0.008676711527143843
第122次迭代逼近值(梯度)为0.008503177296600965
第123次迭代逼近值(梯度)为0.008333113750668945
第124次迭代逼近值(梯度)为0.008166451475655567
第125次迭代逼近值(梯度)为0.008003122446142456
第126次迭代逼近值(梯度)为0.007843059997219607
第127次迭代逼近值(梯度)为0.007686198797275215
第128次迭代逼近值(梯度)为0.00753247482132971
第129次迭代逼近值(梯度)为0.0073818253249031155
第130次迭代逼近值(梯度)为0.007234188818405053
第131次迭代逼近值(梯度)为0.0070895050420369515
第132次迭代逼近值(梯度)为0.006947714941196213
第133次迭代逼近值(梯度)为0.006808760642372289
第134次迭代逼近值(梯度)为0.006672585429524843
第135次迭代逼近值(梯度)为0.006539133720934346
第136次迭代逼近值(梯度)为0.006408351046515659
第137次迭代逼近值(梯度)为0.006280184025585346
第138次迭代逼近值(梯度)为0.006154580345073639
第139次迭代逼近值(梯度)为0.0060314887381721655
第140次迭代逼近值(梯度)为0.005910858963408722
第141次迭代逼近值(梯度)为0.005792641784140548
第142次迭代逼近值(梯度)为0.005676788948457737
第143次迭代逼近值(梯度)为0.005563253169488583
第144次迭代逼近值(梯度)为0.005451988106098811
第145次迭代逼近值(梯度)为0.005342948343976835
第146次迭代逼近值(梯度)为0.005236089377097298
第147次迭代逼近值(梯度)为0.005131367589555352
第148次迭代逼近值(梯度)为0.005028740237764245
第149次迭代逼近值(梯度)为0.00492816543300896
第150次迭代逼近值(梯度)为0.004829602124348781
第151次迭代逼近值(梯度)为0.004733010081861806
第152次迭代逼近值(梯度)为0.004638349880224569
第153次迭代逼近值(梯度)为0.004545582882620078
第154次迭代逼近值(梯度)为0.004454671224967677
第155次迭代逼近值(梯度)为0.004365577800468323
第156次迭代逼近值(梯度)为0.004278266244458957
第157次迭代逼近值(梯度)为0.004192700919569778
第158次迭代逼近值(梯度)为0.004108846901178382
第159次迭代逼近值(梯度)为0.004026669963154815
第160次迭代逼近值(梯度)为0.003946136563891718
第161次迭代逼近值(梯度)为0.003867213832613884
第162次迭代逼近值(梯度)为0.0037898695559616066
第163次迭代逼近值(梯度)为0.0037140721648423742
第164次迭代逼近值(梯度)为0.003639790721545527
第165次迭代逼近值(梯度)为0.0035669949071146165
第166次迭代逼近值(梯度)为0.003495655008972324
第167次迭代逼近值(梯度)为0.0034257419087928777
第168次迭代逼近值(梯度)为0.00335722707061702
第169次迭代逼近值(梯度)为0.00329008252920468
第170次迭代逼近值(梯度)为0.0032242808786205864
第171次迭代逼近值(梯度)为0.003159795261048175
第172次迭代逼近值(梯度)为0.0030965993558272112
第173次迭代逼近值(梯度)为0.003034667368710667
第174次迭代逼近值(梯度)为0.0029739740213364538
第175次迭代逼近值(梯度)为0.0029144945409097247
第176次迭代逼近值(梯度)为0.0028562046500915303
第177次迭代逼近值(梯度)为0.0027990805570896997
第178次迭代逼近值(梯度)为0.0027430989459479057
第179次迭代逼近值(梯度)为0.0026882369670289475
第180次迭代逼近值(梯度)为0.0026344722276883687
第181次迭代逼近值(梯度)为0.0025817827831346014
第182次迭代逼近值(梯度)为0.0025301471274719093
第183次迭代逼近值(梯度)为0.002479544184922471
第184次迭代逼近值(梯度)为0.0024299533012240217
第185次迭代逼近值(梯度)为0.0023813542351995413
第186次迭代逼近值(梯度)为0.0023337271504955503
第187次迭代逼近值(梯度)为0.0022870526074856394
第188次迭代逼近值(梯度)为0.0022413115553359267
第189次迭代逼近值(梯度)为0.0021964853242292083
第190次迭代逼近值(梯度)为0.002152555617744624
第191次迭代逼近值(梯度)为0.0021095045053897317
第192次迭代逼近值(梯度)为0.002067314415281937
第193次迭代逼近值(梯度)为0.0020259681269762984
第194次迭代逼近值(梯度)为0.0019854487644367725
第195次迭代逼近值(梯度)为0.001945739789148037
第196次迭代逼近值(梯度)为0.0019068249933650763
第197次迭代逼近值(梯度)为0.0018686884934977748
第198次迭代逼近值(梯度)为0.0018313147236278192
第199次迭代逼近值(梯度)为0.0017946884291552628
第200次迭代逼近值(梯度)为0.0017587946605721575
第201次迭代逼近值(梯度)为0.0017236187673607144
第202次迭代逼近值(梯度)为0.0016891463920135
第203次迭代逼近值(梯度)为0.00165536346417323
第204次迭代逼近值(梯度)为0.0016222561948897654
第205次迭代逼近值(梯度)为0.0015898110709919701
第206次迭代逼近值(梯度)为0.0015580148495721307
第207次迭代逼近值(梯度)为0.001526854552580688
第208次迭代逼近值(梯度)为0.0014963174615290743
第209次迭代逼近值(梯度)为0.0014663911122984928
第210次迭代逼近值(梯度)为0.001437063290052523
第211次迭代逼近值(梯度)为0.0014083220242514724
第212次迭代逼近值(梯度)为0.001380155583766443
第213次迭代逼近值(梯度)为0.0013525524720911142
第214次迭代逼近值(梯度)为0.0013255014226492918
第215次迭代逼近值(梯度)为0.001298991394196306
第216次迭代逼近值(梯度)为0.00127301156631238
第217次迭代逼近值(梯度)为0.0012475513349861323
第218次迭代逼近值(梯度)为0.0012226003082864098
第219次迭代逼近值(梯度)为0.0011981483021206816
第220次迭代逼近值(梯度)为0.001174185336078268
第221次迭代逼近值(梯度)为0.0011507016293567027
第222次迭代逼近值(梯度)为0.0011276875967695687
第223次迭代逼近值(梯度)为0.0011051338448341773
第224次迭代逼近值(梯度)为0.0010830311679374937
第225次迭代逼近值(梯度)为0.001061370544578744
第226次迭代逼近值(梯度)为0.001040143133687169
第227次迭代逼近值(梯度)为0.0010193402710134258
第228次迭代逼近值(梯度)为0.0009989534655931573
第229次迭代逼近值(梯度)为0.000978974396281294
第230次迭代逼近值(梯度)为0.0009593949083556683
第231次迭代逼近值(梯度)为0.000940207010188555
第232次迭代逼近值(梯度)为0.0009214028699847839
第233次迭代逼近值(梯度)为0.0009029748125850882
第234次迭代逼近值(梯度)为0.0008849153163333864
第235次迭代逼近值(梯度)为0.0008672170100067186
第236次迭代逼近值(梯度)为0.0008498726698065842
第237次迭代逼近值(梯度)为0.0008328752164104526
第238次迭代逼近值(梯度)为0.0008162177120822435
第239次迭代逼近值(梯度)为0.0007998933578405986
第240次迭代逼近值(梯度)为0.0007838954906837866
第241次迭代逼近值(梯度)为0.0007682175808701109
第242次迭代逼近值(梯度)为0.0007528532292527087
第243次迭代逼近值(梯度)为0.0007377961646676545
第244次迭代逼近值(梯度)为0.0007230402413743014
第245次迭代逼近值(梯度)为0.0007085794365468154
第246次迭代逼近值(梯度)为0.0006944078478158791
第247次迭代逼近值(梯度)为0.0006805196908595615
第248次迭代逼近值(梯度)为0.0006669092970423702
第249次迭代逼近值(梯度)为0.0006535711111015229
第250次迭代逼近值(梯度)为0.0006404996888794924
第251次迭代逼近值(梯度)为0.0006276896951019025
第252次迭代逼近值(梯度)为0.0006151359011998645
第253次迭代逼近值(梯度)为0.0006028331831758672
第254次迭代逼近值(梯度)为0.0005907765195123498
第255次迭代逼近值(梯度)为0.0005789609891221028
第256次迭代逼近值(梯度)为0.0005673817693396607
第257次迭代逼近值(梯度)为0.0005560341339528675
第258次迭代逼近值(梯度)为0.0005449134512738102
第259次迭代逼近值(梯度)为0.0005340151822483339
第260次迭代逼近值(梯度)为0.0005233348786033672
第261次迭代逼近值(梯度)为0.0005128681810312999
第262次迭代逼近值(梯度)为0.0005026108174106739
第263次迭代逼近值(梯度)为0.0004925586010624604
最小值为: 0.0004925586010624604
最小值保存小数点后6位:0.000493
目标函数最小值约为: 1.0000002426139756
[-9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

  

(三)城市人口数量与饭店利润实例 

data.txt文件(第一列为人口数,第二列为利润) ,也是一个线性回归问题,找最贴切的一元一次函数,只是这一次有了截距,即b。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

path = 'E:\\machine_learning\\Gradient Descent\\data.txt'
data = pd.read_csv(path, header=None)
plt.scatter(data[:][0], data[:][1], marker='+')
data = np.array(data)
m = data.shape[0]
theta = np.array([0, 0])
data = np.hstack([np.ones([m, 1]), data])
y = data[:, 2]
data = data[:, :2]


def cost_function(data, theta, y):
    cost = np.sum((data.dot(theta) - y) ** 2)
    return cost / (2 * m)


def gradient(data, theta, y):
    grad = np.empty(len(theta))
    grad[0] = np.sum(data.dot(theta) - y)
    for i in range(1, len(theta)):
        grad[i] = (data.dot(theta) - y).dot(data[:, i])
    return grad


def gradient_descent(data, theta, y, eta):
    while True:
        last_theta = theta
        grad = gradient(data, theta, y)
        theta = theta - eta * grad
        print(theta)
        if abs(cost_function(data, last_theta, y) - cost_function(data, theta, y)) < 1e-15:
            break
    return theta


res = gradient_descent(data, theta, y, 0.0001)
X = np.arange(3, 25)
Y = res[0] + res[1] * X
plt.plot(X, Y, color='r')
plt.show()

 data.txt文件及代码见MachineLearningAlgorithm/GradingDesent at main · tongfeima/MachineLearningAlgorithm · GitHub

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩軒轩儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值