梯度下降法

一、原理  

二、示例

以 f(x) = 2*x^{2} + 1 为例

梯度(导数):\Delta f(x) = 4*x

步长:\alpha = 0.1

迭代公式:x_{k+1} = x_{k} - \alpha * \Delta f(x_{k})

第0次迭代:令x = 2

第1次迭代:x_{2} = x_{1} - \alpha * \Delta f(x_{1}) = 2 - 0.1 * (4 * 2) = 1.2

第2次迭代:x_{2} = x_{2} - \alpha * \Delta f(x_{2}) = 1.2 - 0.1 * (4 * 1.2) = 0.72

依次类推

三、代码

/*********
求解方程:
    f(x) = 2x^2 + 1
梯度:
    ∇f(x) = 4*x
--->
迭代公式:
    x_(k+1) = x_(k) - a * ∇f(x_(k));
*/

#include <stdio.h>
#include <stdlib.h>

bool gd(const float x, float& next_x) {
    const float a = 0.1;
    const float e = 0.001;
    float df = 4*x;
    if(df <= e) {
        return false;
    }
    next_x = x - a * df;
    return true;
}

int main() {

    float x = 2.0;

    printf("迭代次数:0: x=%f\n", x);

    int iteration = 500;
    while (iteration-- > 0) {
        if(!gd(x, x)) {
            break;
        }
        printf("迭代次数:%d: x=%f\n", 500 - iteration, x);
    }

    printf("最终结果: x=%f\n", x);

    return 0;
}

输出结果:

迭代次数:0: x=2.000000
迭代次数:1: x=1.200000
迭代次数:2: x=0.720000
迭代次数:3: x=0.432000
迭代次数:4: x=0.259200
迭代次数:5: x=0.155520
迭代次数:6: x=0.093312
迭代次数:7: x=0.055987
迭代次数:8: x=0.033592
迭代次数:9: x=0.020155
迭代次数:10: x=0.012093
迭代次数:11: x=0.007256
迭代次数:12: x=0.004354
迭代次数:13: x=0.002612
迭代次数:14: x=0.001567
迭代次数:15: x=0.000940
迭代次数:16: x=0.000564
迭代次数:17: x=0.000339
迭代次数:18: x=0.000203
最终结果: x=0.000203

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值