目录
前言
本算法仅是目前学习时的记录,如有不当或新奇想法,欢迎在评论区指出。
一、梯度算法的相关概念
一. 梯度
一阶函数里梯度就是表示某一函数在该点处的方向导数沿 着该方向取得较大值,即函数在*当前位置的 导数*。 如果函数为一元函数,梯度就是该函数的导数。
如果为二元函数,梯度定义为:
而多元函数中,如上图我们可以看到,梯度就是分别对每个变量进行偏导,然后用逗号分割开,梯度是 用<>包括起来,说明梯度其实一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的 方向。
二. η
η 在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过 来控制每一步走的距离,步长太大 走的就容易偏离路线,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,导致太阳下 山了,还没有走到山下。所以 的选择在梯度下降法中往往是很重要的! 不能太大也不能太小,太小的 话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!
三. 负梯度
为了使函数下降最快,我们需要让函数朝着负梯度方向下,我们在前文提到,梯度的方向实际就是函数 在此点上升最快的方向, 而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加 上负号;那么如果时上坡,也就是梯度上升算法,当然就不需要添加负号了。
二、梯度算法一般方法
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