ロット勾配降下(テスト対象)

8894 ワード


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してください.