梯度下降法,就是利用负梯度方向来决定每次迭代的新的搜索方向,使得每次迭代(步长)能使待优化的目标函数逐步减小。梯度下降法是2范数下的最速下降法,用来求解函数的最小值,无约束优化。

看数学定义都晦涩,网上发现一个比较通俗的说法:想象你站在一座高山上,你想要用最短的时间下山,但是你每次只能走一步。那你需要做的就是查看你周围360度的范围,找到一个最陡峭的(下降的最快的)方向,然后转移到那个点上;转移到新的位置之后,重复相应的步骤,环顾360度,找到最陡峭的(下降的最快的)方向,然后转移过去,这样每次都是选择最陡峭的方向走,那么很快就能到达山下了。

一个多元函数的梯度方向是该函数值增大最陡的方向,在一元函数中,梯度方向是沿着切线方向;而在多元函数中,梯度向量是函数值f对每个变量的导数,向量的方向就是梯度方向。

梯度下降法的计算过程就是沿梯度下降的方向求解极小值,其迭代公式为:

梯度方向通过对函数求导得到,步长的确定是由线性搜索算法来确定,即把下一个点的坐标作为ak+1的函数,然后求满足f(ak+1)的最小值的即可。

一般情况下,梯度向量为0的明是到了一个极值点,此时梯度的幅值也为0。采用梯度下降算法进行最优化求解时,算法迭代的终止条件是梯度向量的幅值接近0即可,可以设置个非常小的常数阈值。

总结来说,梯度下降法就是在没有约束的情况下求解函数的最小值,通过对函数求导沿着最陡梯度下降,直到梯度向量的增值接近0为止。这里面有两个关键参数要定义,一个是迭代步长;另一个是终止迭代的误差值设置。

回到上文梯度下降法定义,求一个函数最小值的梯度算法。下面代码用梯度下降法来求解函数的最小值。

package sk.ml;

import java.text.DecimalFormat;

/**

* 功能:梯度下降算法,求解 f(x)=x^4-3x^3+2 最小值

* 导数为: f'(x)=4x^3-9x^2

* 作者:Jason.F

* 时间:2017年1月17日

*/

public class GradientDescent {

static double y_cur = 0;//用于每次迭代后的值记录,循环终止时就是最小值

static double x = 6; // 从 x=6开始迭代

double step = 0.01; // 每次迭代的步长

double precision = 0.00001;//误差

static int iter = 0;//迭代次数

//目标函数的导数

private double derivative(double x) {//导数

return 4 * Math.pow(x, 3) - 9 *Math.pow(x, 2);

}

//目标函数,要求解最下值

private double function(double x){//函数

return Math.pow(x, 4)-3 * Math.pow(x, 3)+2;

}

private void getmin() {

y_cur=function(x);

double y_div=function(x);//初始y值

while (y_div > precision){//下降梯度的幅度变化大于误差,继续迭代

//System.out.println("当前y="+y_cur+",x="+x);

x=x-step*derivative(x);//沿梯度负方向移动

y_div=y_cur-function(x);//移动后计算y的变化幅度值

y_cur=function(x);//y值跟着x移动变化,计算下一轮迭代

iter++;

}

}

public static void main(String[] args) {

GradientDescent gd = new GradientDescent();

gd.getmin();

DecimalFormat df=new DecimalFormat("#,##0.00");//格式化设置

System.out.println("迭代"+iter+"次,函数最小值:"+df.format(y_cur)+",对应的x值:"+df.format(x));

}

}

执行结果:

迭代55次,函数最小值:-6.54,对应的x值:2.25

多元函数梯度下降 java_机器学习知识点(五)梯度下降法Java实现相关推荐

  1. 机器学习知识点(五)梯度下降法Java实现

    梯度下降法,就是利用负梯度方向来决定每次迭代的新的搜索方向,使得每次迭代(步长)能使待优化的目标函数逐步减小.梯度下降法是2范数下的最速下降法,用来求解函数的最小值,无约束优化. 看数学定义都晦涩,网 ...

  2. 机器学习中为什么需要梯度下降_机器学习101:一文带你读懂梯度下降

    原标题 | Machine Learning 101: An Intuitive Introduction to Gradient Descent 作者 | Thalles Silva 译者 | 汪鹏 ...

  3. 机器学习:随机梯度下降(SGD)与梯度下降(GD)的区别与代码实现。

    机器学习:随机梯度下降(SGD)与梯度下降(GD)的区别与代码实现. 梯度下降法(GD) 随即梯度下降(SGD) 代码实现 如果想细致的了解:-> 梯度下降法 梯度下降法(GD) 假设函数fx, ...

  4. 随机梯度下降(SGD)与经典的梯度下降法的区别

    随机梯度下降(SGD)与经典的梯度下降法的区别 经典的优化方法,例如梯度下降法,在每次迭代过程中需要使用所有的训练数据,这就给求解大规模数据优化问题带来挑战. 知识点:随机梯度下降法(SGD).小批量 ...

  5. 批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

    批量梯度下降(BGD).随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解 </h1><div class="clear"></div> ...

  6. 深度学习(28)随机梯度下降六: 多输出感知机梯度

    深度学习(28)随机梯度下降六: 多输出感知机梯度 1. Multi-output Perceptron 2. Derivative 3. 代码 Perceptron 单输出感知机梯度 ∂E∂wj0= ...

  7. 机器学习基础(五十九)—— 高级优化算法(梯度下降、L-BFGS、共轭梯度)

    优化算法两大核心,一曰:方向,比如由负梯度方向给出:二曰:步长. 在机器学习领域,不管是基础的梯度下降,还是更为高级的 L-BFGS.共轭梯度,都对应的是参数学习,用来学习相关模型的参数. 1. 梯度 ...

  8. 3. 机器学习中为什么需要梯度下降_机器学习中一些模型为什么要对数据归一化?...

    一般做机器学习应用的时候大部分时间是花费在特征处理上,其中很关键的一步就是对特征数据进行归一化,为什么要归一化呢?很多同学并未搞清楚,维基百科给出的解释: 1)归一化后加快了梯度下降求最优解的速度 蓝 ...

  9. 如何使基于梯度下降的机器学习并行化

    转载自:http://blog.csdn.net/u013166160/article/details/17539427 本文,讨论batch-gradient和stochastic gradient ...

最新文章

  1. boost::safe_numerics模块实现数组索引值可以超出数组边界的测试程序
  2. 教你快速掌握如何使用“Opatch”打补丁
  3. 安装bigdesk后es无法启动_安装天正后,探索者无法双击启动?
  4. Java架构师必须知道的 6 大设计原则
  5. 《revolution in the valley》读后随笔--Steve jobs与Macintosh
  6. C# 3.0新语言特性和改进
  7. 数据结构 --- 线性表学习(php模拟)
  8. dc综合与pt静态时序分析(中文)_新能源汽车小三电系统(PDU/DC/OBC)技术研究详解...
  9. java 并发包脑图
  10. 手机号码正则_中国大陆手机号码的正则表达式总结ChinaMobilePhoneNumberRegex
  11. 惯导标定国内外研究现状小结(删减版)
  12. openwrt mesh网络设置
  13. 数据挖掘(2.4)--数据归约和变换
  14. 基于51单片机八路抢答器课程设计(含proteus仿真图及代码)
  15. JAVA餐厅网站订座系统毕业设计 开题报告
  16. python抽样不同花色纸牌_Python 数据模型 一摞Python风格的纸牌
  17. Ubuntu20.04用gparted软件给/目录 or /home目录扩容 or 压缩
  18. 【故障演练】 Redis Cluster集群,当master宕机,主从切换,客户端报错 timed out
  19. uniapp - 打包(App、H5)
  20. 「技术分享」工业触摸屏之触摸屏分类(连载)

热门文章

  1. SpringMVC 控制层注解
  2. 【JAVA 第三章 流程控制语句】课后习题 输出正整数的顺序相反数
  3. 从零开始学习mitmproxy源码阅读
  4. aws lambda_Express.js和AWS Lambda —无服务器的爱情故事
  5. 蓝奏云数值验证码识别,python调用虹鱼图灵识别插件,超高正确率
  6. Python键鼠操作自动化库PyAutoGUI简介
  7. Python 一键转化代码为流程图
  8. Django框架——ORM数据库操作
  9. Python中使用PhantomJS抓取Javascript网页数据
  10. (转)Redis上踩过的一些坑-美团