batch gradient descent(批量梯度下降)
#include<stdio.h>
int main()
{
//如何求y=2x^2极小值
int i;
double x=-2.0,a=0.05;
for(i=1;i<=100;i++){
x=x-a*4*x;
printf("%lf\t",x);
}
//如何求解x=[x1,x2]使y=5x1^2+6x2^2+7x1x2-8的极小值?
//一般想法是分别对x1,x2求导等于0 ,求解极值
double x1=2.0,x2=2.0;
for(i=1;i<=100;i++){
x1=x1-a*(10*x1+7*x2);
x2=x1-a*(12*x2+7*x1);
printf("%lf %lf",x1,x2);
}
//梯度下降
double d[4][3]={
{1.0,1.0,4.0},{1.0,2.0,5.0},{1.0,5.0,1.0},{1.0,4.0,2.0}};//x0=1
int y[4]={19,26,19,20};
double theta[3]={0.0,2.0,5.0};//theta=0
float b=0.01;
float loss=1000;
int s,j,k;
double h=0.0,cha;
for( s=1;s<1000&&loss>0.0001;s++){
for( j=0;j<4;j++){
h=0;
for( k=0;k<3;k++){
h=h+theta[k]*d[j][k];//求出h=θ[i]*x[i]
}
cha=y[j]-h;//求出yi-hi
for( k=0;k<3;k++){
theta[k]=theta[k]+a*cha*d[j][k];//迭代theta
}
}
printf("%lf %lf %lf\t",theta[0],theta[1]),theta[2];//迭代多少次输出多少
}
return 0;
}
stochastic gradient descent(随机梯度下降)【这部分复制过来的】
- int main(void)