目录
1、概念
梯度下降在机器学习中应用十分广泛,可以运用到线性拟合等领域里。本文采用下山的方法来帮助大家理解梯度算法的原理。
2、梯度下降算法
2.1场景
我们需要从山上到山谷。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处。
2.2梯度概念
在高等数学中梯度是这样定义的:梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
一元函数中梯度是:
而多元函数(以二元函数为列)梯度是:
3、梯度算法
3.1基本思路:
通过迭代求出最小值,基本公式如下:
梯度算法需要的参数:length(η):步长、accuracy:精确度(误差所容忍的值)、x0:初始值
3.2 length:
length在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过 来控制每一步走的距离,步长太大 走的就容易偏离路线,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,导致太阳下 山了,还没有走到山下。所以 的选择在梯度下降法中往往是很重要的! 不能太大也不能太小,太小的 话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!
3.3正负梯度:
由梯度的知识点我们很容易知道当我们要上山时就应该是正号,而我们下山时应该时负号。因为梯度是函数变化最快快的方向。
4、代码实现:
4.1Python
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
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)))
运行结果:
4.2C++
#include<iostream>
using namespace std;
//定义初始函数
double fun(double x){
return (x*x)/2-2*x;
}
//定义初始函数的导数
double der_fun(double x){
return x-2.0;
}
int main(){
//取三个变量分别为步长、精确度和初始位置(此处可以是任意值)
double length,accuracy,x0;
cout<<"请输入步长以及精确度和初始值"<<endl;
cin>>length>>accuracy>>x0;
cout<<"初始时的位置为x:"<<x0<<"\ty:"<<fun(x0)<<endl;
int i=0;//记录迭代次数
while((-1)*length*der_fun(x0)>accuracy){
x0-=length*der_fun(x0);
i++;
cout<<"第"<<i<<"次迭代时的位置为x:"<<x0<<"\ty:"<<fun(x0)<<endl;
}
return 0;
}
运行结果如下:
5、结尾
其实梯度算法并没有我写的这么简单,我的知识简单的介绍了梯度算法的原理。梯度算法可以进行直线拟合等操作。大家可以参考这位大佬如何求直线拟合的方法链接如下:https://blog.youkuaiyun.com/qq_41800366/article/details/86583789