admin管理员组文章数量:1031978
Java中的梯度下降
1. 简介
在本教程中,我们将了解梯度下降算法。我们将在 Java 中实现该算法并逐步说明它。
2. 什么是梯度下降?
梯度下降是一种优化算法,用于查找给定函数的局部最小值。它广泛用于高级机器学习算法中,以最小化损失函数。
坡度是坡度的另一个词,下降意味着下降。顾名思义,梯度下降沿着函数的斜率向下,直到它到达终点。
3. 梯度下降的性质
梯度下降查找局部最小值,该最小值可能与全局最小值不同。起始局部点作为算法的参数给出。
这是一个迭代算法,在每一步中,它都试图沿着斜率向下移动并接近局部最小值。
在实践中,该算法是回溯的。我们将在本教程中说明和实现回溯梯度下降。
4. 分步说明
梯度下降需要一个函数和一个起点作为输入。让我们定义并绘制一个函数:
我们可以从任何想要的点开始。让我们从x=1 开始:
在第一步中,梯度下降以预定义的步长沿着斜坡向下:
接下来,它以相同的步长走得更远。但是,这次它最终比最后一步的y大:
这表示算法已超过局部最小值,因此它以减小的步长向后移动:
随后,每当当前 y 大于前一个y 时,步长就会降低并取反。迭代继续进行,直到达到所需的精度。
正如我们所看到的,梯度下降在这里发现了一个局部最小值,但它不是全局最小值。如果我们从 x=-1 而不是x=1 开始,将找到全局最小值。
5. 在 Java 中的实现
有几种方法可以实现梯度下降。在这里,我们不计算函数的导数来找到斜率的方向,因此我们的实现也适用于不可微函数。
让我们定义精度和步进系数,并给出它们的初始值:
代码语言:javascript代码运行次数:0运行复制double precision = 0.000001;
double stepCoefficient = 0.1;Copy
第一步,我们没有用于比较的前y。我们可以增加或减少x的值,看看y是降低还是提高。正步进系数意味着我们正在增加x 的值。
现在让我们执行第一步:
代码语言:javascript代码运行次数:0运行复制double previousX = initialX;
double previousY = f.apply(previousX);
currentX += stepCoefficient * previousY;Copy
在上面的代码中,f是一个Function<Double、Double>,initialX是一个double,两者都作为输入提供。
另一个需要考虑的关键点是梯度下降不能保证收敛。为了避免陷入循环,让我们对迭代次数进行限制:
代码语言:javascript代码运行次数:0运行复制int iter = 100;Copy
稍后,我们将在每次迭代时将iter 递减 1。因此,我们将在最多 100 次迭代时退出循环。
现在我们有一个previousX,我们可以设置我们的循环:
代码语言:javascript代码运行次数:0运行复制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);
}Copy
在每次迭代中,我们计算新的y 并将其与之前的y 进行比较。如果currentY大于previousY,我们改变方向并减小步长。
循环一直持续到我们的步长小于所需的精度。最后,我们可以返回currentX作为局部最小值:
代码语言:javascript代码运行次数:0运行复制return currentX;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-02-20,如有侵权请联系 cloudcommunity@tencent 删除教程算法优化java函数Java中的梯度下降
1. 简介
在本教程中,我们将了解梯度下降算法。我们将在 Java 中实现该算法并逐步说明它。
2. 什么是梯度下降?
梯度下降是一种优化算法,用于查找给定函数的局部最小值。它广泛用于高级机器学习算法中,以最小化损失函数。
坡度是坡度的另一个词,下降意味着下降。顾名思义,梯度下降沿着函数的斜率向下,直到它到达终点。
3. 梯度下降的性质
梯度下降查找局部最小值,该最小值可能与全局最小值不同。起始局部点作为算法的参数给出。
这是一个迭代算法,在每一步中,它都试图沿着斜率向下移动并接近局部最小值。
在实践中,该算法是回溯的。我们将在本教程中说明和实现回溯梯度下降。
4. 分步说明
梯度下降需要一个函数和一个起点作为输入。让我们定义并绘制一个函数:
我们可以从任何想要的点开始。让我们从x=1 开始:
在第一步中,梯度下降以预定义的步长沿着斜坡向下:
接下来,它以相同的步长走得更远。但是,这次它最终比最后一步的y大:
这表示算法已超过局部最小值,因此它以减小的步长向后移动:
随后,每当当前 y 大于前一个y 时,步长就会降低并取反。迭代继续进行,直到达到所需的精度。
正如我们所看到的,梯度下降在这里发现了一个局部最小值,但它不是全局最小值。如果我们从 x=-1 而不是x=1 开始,将找到全局最小值。
5. 在 Java 中的实现
有几种方法可以实现梯度下降。在这里,我们不计算函数的导数来找到斜率的方向,因此我们的实现也适用于不可微函数。
让我们定义精度和步进系数,并给出它们的初始值:
代码语言:javascript代码运行次数:0运行复制double precision = 0.000001;
double stepCoefficient = 0.1;Copy
第一步,我们没有用于比较的前y。我们可以增加或减少x的值,看看y是降低还是提高。正步进系数意味着我们正在增加x 的值。
现在让我们执行第一步:
代码语言:javascript代码运行次数:0运行复制double previousX = initialX;
double previousY = f.apply(previousX);
currentX += stepCoefficient * previousY;Copy
在上面的代码中,f是一个Function<Double、Double>,initialX是一个double,两者都作为输入提供。
另一个需要考虑的关键点是梯度下降不能保证收敛。为了避免陷入循环,让我们对迭代次数进行限制:
代码语言:javascript代码运行次数:0运行复制int iter = 100;Copy
稍后,我们将在每次迭代时将iter 递减 1。因此,我们将在最多 100 次迭代时退出循环。
现在我们有一个previousX,我们可以设置我们的循环:
代码语言:javascript代码运行次数:0运行复制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);
}Copy
在每次迭代中,我们计算新的y 并将其与之前的y 进行比较。如果currentY大于previousY,我们改变方向并减小步长。
循环一直持续到我们的步长小于所需的精度。最后,我们可以返回currentX作为局部最小值:
代码语言:javascript代码运行次数:0运行复制return currentX;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-02-20,如有侵权请联系 cloudcommunity@tencent 删除教程算法优化java函数本文标签: Java中的梯度下降
版权声明:本文标题:Java中的梯度下降 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1747902386a2225226.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论