用C++的梯度下降单变量线性回归

完全初学者水平的代码(>_<)

//线性回归 
#include<iostream>
#include<cstdlib>
#include<ctime>
#include <cmath>
#include <limits>
using namespace std;
double generateGaussianNoise(double mu, double sigma);
//人工制造一些噪声

//定义模型
double model(double x,double w,double b){
	return w*x+b;
}

int main(){
	srand(time(NULL));
	//准备训练数据 
	double x_data[100],y_data[100];
	for(int i=0;i<100;++i){
		x_data[i]=(double)(i+1)/100;
		y_data[i]=6*x_data[i]+4+generateGaussianNoise(0,0.1);
		//就回归一个y=6x+4试试呗
	}
	
	double w=1.0,b=1.0;
	
	//超参数
	const int train_epochs=300; //训练次数
	const double learning_rate=0.05;//学习率

	for(int i=0;i<train_epochs;i++){//对于每一轮训练 
	double loss_avarage=0;
		for(int j=0;j<100;++j){
			double x=x_data[j],y=y_data[j];
			double pred=model(w,x,b);
			double loss_function=(y-pred)*(y-pred);
			loss_avarage+=loss_function;
			double dw=2*(pred-y)*x,db=2*(pred-y);
			//梯度下降
			w-=dw*learning_rate;
			b-=db*learning_rate;
		}
		cout<<"epoch="<<i<<"  w="<<w<<"  b="<<b<<endl;
		cout<<"loss="<<loss_avarage<<endl;
	}
	 
	return 0;
} 


double generateGaussianNoise(double mu, double sigma)
{
    const double epsilon = std::numeric_limits<double>::min();
    const double two_pi = 2.0*3.14159265358979323846;

    static double z0, z1;
    static bool generate;
    generate = !generate;

    if (!generate)
       return z1 * sigma + mu;

    double u1, u2;
    do
     {
       u1 = rand() * (1.0 / RAND_MAX);
       u2 = rand() * (1.0 / RAND_MAX);
     }
    while ( u1 <= epsilon );

    z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2);
    z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2);
    return z0 * sigma + mu;
}

讲真比tensorflow简单多了其实
以上.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值