用 Java 实现梯度下降,看这篇就对了!
点击上方 "程序员小乐"关注, 星标或置顶一起成长
每天凌晨00点00分, 第一时间与你相约
每日英文
Smile and stop complaining about the things you can't change. Time keeps ticking whether you're happy or sad.
保持微笑,停止抱怨那些改变不了的事。无论你开心与否,时间总是不等人的。
每日掏心话
你不努力,机会有可能遇到。努力,会增加了遇见机会的概率。吴闲云说:所谓努力,其实就是愿意白干。不求回报做很多事的人,一般都能获得更多的机会。
来自:覃佑桦 | 责编:乐乐
链接:baeldung.com/java-gradient-descent
程序员小乐(ID:study_tech)第 849 次推文 图源:百度
往日回顾:去掉烦人的 “ ! = null " (判空语句)
正文
1.引言
文本会学习梯度下降算法。我们将分步对算法实现过程进行说明并用Java实现。
2.什么是梯度下降?
梯度下降是一种优化算法,用于查找给定函数的局部最小值。它被广泛用于高级机器学习算法中,最小化损失函数。
梯度(gradient)是坡度(slope)的另一种表达,下降(descent)表示降低。顾名思义,梯度下降随着函数的斜率下降直到抵达终点。
3.梯度下降特性
梯度下降可找到局部最小值,该局部最小值有可能与全局最小值不同。起始局部点会作为算法的一个参数给出。
这是一种迭代算法。每一步都会尝试沿斜率向下移动并接近局部最小值。
实践中,算法采用的是回溯(backtrack)。接下来我们将采用回溯实现梯度下降。
4.分步说明
梯度下降需要一个函数和一个起点作为输入。让我们定义并绘制一个函数:
可以从任何期望的点开始。让我们从 x=1 开始:
第一步,梯度下降以预定的步长沿斜率下降:
接下来以相同的步长继续前进。但是,这次结束时的y 值比上次大:
这就表明算法已超过了局部最小值,因此用较小的步长后退:
随后,只要当前y 大于前一次 y,就会减小步长并取反。迭代会一直进行直到满足所需的精度。
如我们看到的那样,梯度下降在这里处找到了局部最小值,但不是全局最小值。如果我们从 x=-1 而非 x=1 开始,则能找到全局最小值。
5.Java实现
有几种方法能够实现梯度下降。这里没有采用计算函数的导数来确定斜率的方向,因此我们的实现也适用于不可微函数。
定义 precision 和 stepCoefficient 并给它赋上初值:
double precision = 0.000001;
double stepCoefficient = 0.1;
进行第一步时,没有之前的 y 作比较。我们可以增加或减少 x 值确认 y 值是减少或增加。stepCoefficient 为正数表明正在增加 x 值。
现在让我们执行第一步:
double previousX = initialX;
double previousY = f.apply(previousX);
currentX += stepCoefficient * previousY;
上面的代码中,f 是 Function<Double, Double>,initialX 的类型是 double,二者都作为输入。
另一个需要考虑的关键点,梯度下降并不保证收敛。为了避免陷入死循环,需要限制迭代次数:
int iter = 100;
每次迭代都把 iter 减1。因此,最多循环100次。
现在有了一个 previousX,我们可以设置循环了:
while (previousStep > precision && iter > 0) {iter--;double currentY = f.apply(currentX);if (currentY > previousY) {stepCoefficient = -stepCoefficient/2;}previousX = currentX;currentX += stepCoefficient * previousY;previousY = currentY;previousStep = StrictMath.abs(currentX - previousX);
}
每次迭代,我们都会计算新的 y 值并将其与之前的 y 比较。如果 currentY 大于 previousY,将改变方向并减小步长。
循环会一直进行直到步长小于期望的precision 为止。最后,返回 currentX 作为本地最小值:
return currentX;
6.总结
本文分步骤介绍了梯度下降算法。
还用Java对算法进行了实现,完整源代码可以从 GitHub 下载。
欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。
欢迎各位读者加入订阅号程序员小乐技术群,在后台回复“加群”或者“学习”即可。
猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
彻底搞懂MySQL分区,看这篇就对了!
各种 Java Web 开发人员的通用工具
Git 如何优雅地回退代码,用 reset 还是 revert ?
关注订阅号「程序员小乐」,收看更多精彩内容
嘿,你在看吗?
用 Java 实现梯度下降,看这篇就对了!相关推荐
- Sklearn官方文档中文整理4——随机梯度下降和最近邻篇
Sklearn官方文档中文整理4--随机梯度下降和最近邻篇 1. 监督学习 1.5. 随机梯度下降 1.5.1. 分类[linear_model.SGDClassifier] 1.5.2. 回归[li ...
- Java应用系统监控看这篇就够了
Java应用系统监控看这篇就够了 文章目录 业务背景 系统监控发展历程 技术方案 日志监控技术方案 Grafana+阿里云SLS日志服务 分布式链路追踪技术方案 阿里云jaeger方案 开源框架sky ...
- 女生就不适合学Java吗_女生不适合学java?给他看这篇文章,女生其实更适合学java,更好就业!...
原标题:女生不适合学java?给他看这篇文章,女生其实更适合学java,更好就业! 女生适合学java吗?女生做IT怎么样 首先要表明我的观点,编程是不分男女,什么女生不适合学编程的说法,从客观上来说 ...
- 梯度下降算法 java_用 Java 实现梯度下降,看这篇就对了!
每天凌晨00点00分, 第一时间与你相约 每日英文 Smile and stop complaining about the things you can't change. Time keeps t ...
- Java 集合框架,看这篇真的够了!
话不多说,直接上图: Java 集合,也称作容器,主要是由两大接口 (Interface) 派生出来的: Collection 和 Map 顾名思义,容器就是用来存放数据的. 那么这两大接口的不同之处 ...
- Java应用梯度下降求解线性SVM模型参考代码
下面的代码是参考网上的,直接执行,主要是为了后续进一步掌握SVM原理而发布. 两个基本原理还是要去掌握:SVM原理和梯度下降法. 1)SVM分类器: 支持向量机,因其英文名为support vecto ...
- 搞懂Java分布式锁实现看这篇文章就对了
2019独角兽企业重金招聘Python工程师标准>>> 前言: 随着微处理机技术的发展,人们只需花几百美元就能买到一个CPU芯片,这个芯片每秒钟执行的指令比80年代最大的大型机的处理 ...
- java空间大战,看这篇足矣了!
开头 在找工作的过程中,对于 Redis 技术知识的掌握已经成为必须的技能.美团面试常常就会被问到Redis相关知识,而这次我就差点倒在了美团3面,面试官连问我以下几个Redis的问题,然后就卡壳了- ...
- Jaeger的客户端采样配置(Java版)(1),看这篇文章准没错
echo "启动docker-compose" cd jaeger-service-provider && docker-compose up -d &&a ...
- java集合大全,看这篇足够理解了
一.集合入门总结 集合框架: Java中的集合框架大类可分为Collection和Map:两者的区别: 1.Collection是单列集合:Map是双列集合 2.Collection中只有Set系列要 ...
最新文章
- 私有网盘nextcloud 12的问题处理及优化
- vue 多选自动触发_Vue,初次邂逅(二)
- 理解卡夫卡的初学者指南
- 帆软报表-打印sql日志设置
- 7、【转载】python yield generator 详解
- 计算机组成原理(白中英)简答题复习
- Swift 使用SwiftyJSON解析JSON数据
- xen html插件天气不会刷新,天气通刷新不了怎么办 刷新不了解决方法
- 《2020国内WAF产品研究报告》
- Unity 中 print 和 Debug.Log 的区别
- IP周边创作交流#创作者的个人影响力
- 20220425二次型复习
- 安卓手机通讯录恢复教程
- IOS - 七大手势操作
- 自考本科计算机专业英语作文,成人学位英语作文万能模板
- linux——管道详解
- 细细品味hadoop
- 能够在乱世中_在乱世纷纷的时代,庄子依然能够在浮华的人生,活出本真的自我...
- 增长黑客内容摘要(四五六章)
- linux ntp时间立即同步命令_Linux系统时间同步方法小结
热门文章
- 【逗老师带你学IT】阿里云监控报警回调+转发企业微信+转发SnmpTrap+PRTG
- 电脑 清理android,怎样清除系统垃圾 手机电脑一举拿下【图文】
- 美团校招笔试题-算法8.20-python
- 北京最好的商标律师解析商标侵权的处罚规定
- 使用费马小定理和欧拉定理计算余数
- 有人痴狂,有人跑路,开源软件新一年的冰火两重天
- linux 微信客户端 mojo,QQ微信一体客户端教程
- 批量为Word2010尾注加方括号[]的方法
- 博纳影业明日上市:于冬陷入与江疏影绯闻 被曝斥资千万买珠宝
- steam linux 安装目录,如何在Ubuntu中安装Steam | MOS86