ロット勾配降下(テスト対象)
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してください.