梯度下降算法理解总结(大白话)

梯度下降算法AI必备算法 我理解就是求函数最小值的

一维梯度下降 f(x) = x^2 我理解的跟画图那个没区别 偏导数求出结果画图

#include <iostream>
#include <vector>
#include <cmath>

// 假设我们的目标函数是 f(x) = x^2
double objectiveFunction(double x) {
    return x * x;
}

// 计算目标函数的导数
double derivative(double x) {
    return 2 * x;
}

// 梯度下降算法
double gradientDescent(double initialX, double learningRate, int iterations) {
    double x = initialX;
    for (int i = 0; i < iterations; ++i) {
        double grad = derivative(x);
        x -= learningRate * grad; // 更新x的值
    }
    return x;
}

int main() {
    double initialX = 50.0; // 初始值
    double learningRate = 0.1; // 学习率
    int iterations = 100; // 迭代次数

    double minX = gradientDescent(initialX, learningRate, iterations);
    std::cout << "最小值 x = " << minX << " with f(x) = " << objectiveFunction(minX) << std::endl;

    return 0;
}

二维梯度是两个变量求得偏导数向量 然后乘上学习率,我理解学习率其实就是一个步长这求出每次迭代偏移 然后再加上上一次的坐标就得到了新坐标 这个有点类似打飞机游戏里的弹道移动 最后计算f(x, y) = x^2 + y^2 得到该坐标的数值就是最低数值 选的坐标不一样最低值也不一样 不一定是整个梯度的最小值 是局部最小值

#include <iostream>  
#include <vector>  
#include <cmath>  
  
// 目标函数 f(x, y) = x^2 + y^2  
double f(double x, double y) {  
    return x * x + y * y;  
}  
  
// 目标函数关于x的偏导数 df/dx = 2x  
double df_dx(double x, double /*y*/) {  
    return 2 * x;  
}  
  
// 目标函数关于y的偏导数 df/dy = 2y  
double df_dy(double /*x*/, double y) {  
    return 2 * y;  
}  
  
// 梯度下降算法  
void gradientDescent(double& x, double& y, double learning_rate, int iterations) {  
    for (int i = 0; i < iterations; ++i) {  
        // 计算梯度  
        double grad_x = df_dx(x, y);  
        double grad_y = df_dy(x, y);  
          
        // 更新变量  
        x -= learning_rate * grad_x;  
        y -= learning_rate * grad_y;  
          
        // 输出迭代信息  
        std::cout << "迭代 " << i + 1 << ": (" << x << ", " << y << "), f(x, y) = " << f(x, y) << std::endl;  
    }  
}  
  
int main() {  
    double x = 5.0; // x的初始值  
    double y = 5.0; // y的初始值  
    double learning_rate = 0.01; // 学习率  
    int iterations = 100; // 迭代次数  
  
    std::cout << "梯度开始位置 (" << x << ", " << y << ")" << std::endl;  
    gradientDescent(x, y, learning_rate, iterations);  
    std::cout << "梯度结束最小值位置 (" << x << ", " << y << ")" << std::endl;  
  
    return 0;  
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值