简单的梯度下降(C++实现) - Blog of Mathias
Blog of Mathias Web Securtiy&Deep Learning
简单的梯度下降(C++实现)
发表于: | 分类: 技术文章 | 评论:0 | 阅读:507
  • 梯度下降(gradient descent)是最古老,也最经典的一种求解优化问题的算法

  • 由于梯度本身也可视为偏导数,也就是函数值变化最快的那个方向.因此它也被称为最速下降法

  • 这里采用C++实现了这个算法 数据集很简单的采用了andrew ng的房价与房屋面积的几个数据点,只是作为演示

    #include "stdafx.h"
    #include "math.h"
    #include "stdio.h"
    #include "string.h"
    #include "stdlib.h"
    class data{
    public:
    double theta;
    int x[8];
    int y[8];
    };
    float gds(int x,int y,float theta,double* los,double rate)
    {
    theta = theta - rate(thetax-y)*x; //进行一次随机梯度下降
    los = thetax - y; //本次下降后的误差率
    printf("gradient descent:theta now %f\n", theta);
    return theta;
    }
    int _tmain(void)
    {
    int i,j,time;
    double rate,loss,eps;
    double* los = &loss;
    printf("请输入迭代的次数\n");
    scanf("%d", &time);
    printf("请输入学习率\n");
    scanf("%lf", &rate);
    printf("请输入期望\n");
    scanf("%lf", &eps);
    rate = raterate0.01;
    loss = 50;
    data data1;
    data1.theta = 3;
    int x[]={ 1600, 2104, 2400, 1416, 3000, 4000, 4300, 4500 };
    int y[]={ 330, 400, 369, 232, 540, 588, 550, 710 };
    int max = sizeof(x)/4;
    max--;
    memcpy(data1.x,x,sizeof(x));
    memcpy(data1.y, y, sizeof(y));
    for (j = 0; j < time ||(lossloss<eps); j++)
    {
    for (i = 0; i <= max; i++)
    {
    data1.theta = gds(data1.x[i], data1.y[i], data1.theta, los,rate);
    }
    }
    printf("theta值为%f,共经过%d次梯度下降\n", data1.theta,j
    i);
    system("pause");
    return 0;
    }

  • 运行结果
    1.png

拟合效果已经比较接近了。经过更多迭代后
2.png

算法已经收敛

还不快抢沙发

添加新评论