梯度下降算法 c++实现

Posted zyf3855923

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了梯度下降算法 c++实现相关的知识,希望对你有一定的参考价值。

没有数据标准化的版本,效率非常高,而且训练结果并不好。

#include <iostream>
#define maxn 105
#include <cstdio>
using namespace std;
int n,m;  //n个特征,m个数据
double theta[maxn];//参数集
double temp[maxn];
double data[maxn][maxn];//数据集
double Y[maxn];//结果集
double hx[maxn];
const double eps=0.37;
double alpha=0.00001;
double h(int x)//计算假设函数

    double res=0;
    for(int i=0;i<=n;++i)
    
        res+=theta[i]*data[x][i];
    
    return res;

double J_theta()//计算cost function

    double res=0;
    for(int i=1;i<=m;++i)
    
        res+=(h(i)-Y[i])*(h(i)-Y[i]);
    
    res=res/(2*m);
    return res;

double f(int x)//求偏导数

    double res=0;
    for(int i=1;i<=m;++i)
    
        res+=hx[i]*data[i][x];
    
    res/=m;
    return res;

void Gradient_Descent()//梯度下降

    for(int i=1;i<=m;++i)
    
        data[i][0]=1;
    
    for(int i=0;i<=n;++i)
    
        theta[i]=1;//初始化
    
    double now,nex;
    do
    
        now=J_theta();
        for(int i=1;i<=m;++i)
        
            hx[i]=h(i)-Y[i];
        
        for(int i=0;i<=n;++i)
        
            temp[i]=theta[i]-alpha*f(i);
        
        for(int i=0;i<=n;++i)
        
            theta[i]=temp[i];
        
        nex=J_theta();
        //cout<<J_theta()<<endl;
    while (J_theta()>eps);

int main()

    freopen("in.txt","r",stdin);
    cin>>n>>m;
    for(int i=1;i<=m;++i)
    
        for(int j=1;j<=n;++j)
        
            cin>>data[i][j];
        
    
    for(int i=1;i<=m;++i)
    
        cin>>Y[i];
    
    Gradient_Descent();
    for(int i=0;i<=n;++i)
    
        printf("%.2lf\n",theta[i]);
    
    return 0;

 

以上是关于梯度下降算法 c++实现的主要内容,如果未能解决你的问题,请参考以下文章

什么是梯度下降优化算法?

梯度下降算法的原理是啥?

Spark MLib:梯度下降算法实现

梯度下降算法 - Python实现

梯度下降法及其实现

梯度下降法介绍-黑马程序员机器学习讲义