【算法】浅试梯度下降算法

本文详细介绍了梯度算法的概念,包括梯度、学习率η和负梯度的含义,以及梯度下降的基本步骤和实例。通过Python和C语言代码演示,展示了如何在实际问题中应用这些概念。总结部分强调了选择合适的学习率对于算法效率的重要性。
摘要由CSDN通过智能技术生成

目录

目录

前言

一、梯度算法的相关概念

        一. 梯度

        二. η 

        三. 负梯度

二、梯度算法一般方法

1.梯度算法一般步骤

2.梯度算法样题与解法

总结


前言

        本算法仅是目前学习时的记录,如有不当或新奇想法,欢迎在评论区指出。


一、梯度算法的相关概念

        一. 梯度

        一阶函数里梯度就是表示某一函数在该点处的方向导数沿 着该方向取得较大值,即函数在*当前位置的 导数*。 如果函数为一元函数,梯度就是该函数的导数。

        如果为二元函数,梯度定义为:

        而多元函数中,如上图我们可以看到,梯度就是分别对每个变量进行偏导,然后用逗号分割开,梯度是 用<>包括起来,说明梯度其实一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的 方向。

        二. η 

         η 在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过 来控制每一步走的距离,步长太大 走的就容易偏离路线,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,导致太阳下 山了,还没有走到山下。所以 的选择在梯度下降法中往往是很重要的! 不能太大也不能太小,太小的 话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!

        三. 负梯度

        为了使函数下降最快,我们需要让函数朝着负梯度方向下,我们在前文提到,梯度的方向实际就是函数 在此点上升最快的方向, 而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加 上负号;那么如果时上坡,也就是梯度上升算法,当然就不需要添加负号了。

二、梯度算法一般方法

1.梯度算法一般步骤

2.梯度算法样题与解法

大致思路:

 相关代码实现:

python:

# coding=UTF-8
import numpy as np
from matplotlib import pyplot as plt

def f(x):
    return (x*x)/2-2*x
def f_1(x):
    return x-2

# length,accuracy,x =eval(input("请输入步长和精确度已经初始位置:"))

length=0.9
accuracy=0.01
x=-4
i =0

xs = np.arange(-5, 10)# 限制自变量x的范围
plt.plot(xs, f(xs))#绘图
plt.show()

while ((-1)*(length * f_1(x))>accuracy):
    i=i+1
    x=x-length*f_1(x)
print("第%d次迭代\nx=%f\ny=%f\n"%(i,x,f(x)))

运行结果如下:

 

C :

#include "stdio.h"

double fun(double x){       //定义初始函数
    return x*x/2.0 - 2*x;
}

double der_fun(double x){       //求函数的导数
    return x - 2.0;
}

int main(){
    double length,accuracy;     //定义步长,精确度
    double x0,x1;      //定义初始位置
    printf("请输入步长,精确度及其初始位置:");
    scanf("%lf %lf %lf",&length,&accuracy,&x0);
    while(length*(-1)*der_fun(x0) > accuracy){
        x0 = x0 - length*der_fun(x0);
    }
    printf("x = %.5lf\ny = %.5lf",x0,fun(x0));
    return 0;

}

运行结果如下:


总结

        本算法先根据初始x算出其相应的导数与梯度,进而通过下式:

求出下一位置x的值,并算出△x,与精确度相比较,来判断是否继续循环,直至满足题目要求即可。


资料参考&部分图片来自:CSDN博主m0_56689123

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值