对于Lost Function利用梯度下降的方法实现参数调整,梯度下降在每一次迭代的过程中需要全部样本参与,而随机梯度法或增量梯度法在迭代中利用样本中的一个样本更新参数。
梯度下降达到全局最优:
#include <cstdlib>
#include <iostream>
using namespace std;
#define MAXITER 2200
int main(int argc, char *argv[])
{
float x[4]={1,2,3,4};
float y[4]={1.1,2.2,2.7,3.8};
float theta0,theta1;
float a=0.2;
theta0=0;
theta1=1.1;
float ptheta0=theta0;
float ptheta1=theta1;
//梯度下降
int iter=1;
float diff;
while(iter<=MAXITER)
{
for(int i=0;i<4;i++)
{
diff=(theta0+theta1*x[i]-y[i]);
theta0=theta0-a*diff*1;
theta1=theta1-a*diff*x[i];
}
//if((ptheta0-theta0)*(ptheta0-theta0)+(ptheta1-theta1)*(ptheta1-theta1)<0.1) break;
//else
//{
ptheta0=theta0;
ptheta1=theta1;
//}
iter=iter+1;
}
printf("iter=%d\n",iter);
printf("theta0=%f,theta1=%f\n",theta0,theta1);
system("PAUSE");
return EXIT_SUCCESS;
}
随机梯度法接近全局最优:
#include <cstdlib>
#include <iostream>
using namespace std;
#define MAXITER 2200
/*********************
**Y=theta0+theta1X
*********************/
int main(int argc, char *argv[])
{
float x[4]={1,2,3,4};
float y[4]={1.1,2.2,2.7,3.8};
float theta0,theta1;
float a=0.2;
theta0=0;
theta1=1.1;
float ptheta0=theta0;
float ptheta1=theta1;
//梯度下降
int iter=1;
float diff;
while(iter<=MAXITER)
{
int i=(iter-1)%4;
diff=(theta0+theta1*x[i]-y[i]);
theta0=theta0-a*diff*1;
theta1=theta1-a*diff*x[i];
//if((ptheta0-theta0)*(ptheta0-theta0)+(ptheta1-theta1)*(ptheta1-theta1)<0.1) break;
//else
//{
ptheta0=theta0;
ptheta1=theta1;
//}
iter=iter+1;
}
printf("iter=%d\n",iter);
printf("theta0=%f,theta1=%f\n",theta0,theta1);
system("PAUSE");
return EXIT_SUCCESS;
}