完全初学者水平的代码(>_<)
//线性回归
#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简单多了其实
以上.