1 #include<iostream> 2 using namespace std; 3 //批量梯度下降 4 int main() 5 { 6 double train_data[100][3]; 7 double learn_rate=0.01,loss=100; 8 9 for(int i=0;i<=100;i++) 10 { 11 cin>>train_data[i][0]>>train_data[i][1]>>train_data[i][2]; 12 if(train_data[i][0]==-1) 13 break; 14 } 15 int n=i; 16 double c[2],h,error1; 17 c[0]=0;c[1]=0; 18 cout<<n<<endl; 19 20 for(int k=0;k<1000&&loss>0.0001;k++) 21 {//循环主要是控制迭代停止条件的,循环包括两部分 22 //一、对所有的theta更新一次 二、计算更新后的loss是否符合停止条件 23 for(int j=0;j<n;j++) 24 {//对所有的theta更新 25 h=0; 26 for(i=0;i<2;i++) 27 { 28 h=h+c[i]*train_data[j][i]; 29 } 30 error1=train_data[j][2]-h; 31 for(i=0;i<2;i++) 32 { 33 c[i]=c[i]+learn_rate*error1*train_data[j][i]; 34 } 35 } 36 loss=0; 37 for(j=0;j<n;j++) 38 {//计算更新后的loss 39 h=0; 40 for(i=0;i<2;i++) 41 { 42 h=h+c[i]*train_data[j][i]; 43 } 44 error1=train_data[j][2]-h; 45 46 loss=loss+error1*error1; 47 } 48 49 } 50 51 cout<<"学习完毕,拟合函数为h(x)="<<c[0]<<"x1+"<<c[1]<<"x2"<<endl; 52 53 double x1,x2; 54 while(1) 55 { 56 cout<<"请输入要查询的数据,例如1 2"<<endl; 57 cin>>x1>>x2; 58 if(x1==-1) break; 59 cout<<x1*c[0]+x2*c[1]<<endl; 60 } 61 }
只对小数据进行了测试,还没有测试正式的数据集,mark一下。