1、梯度下降c代码

来源:互联网 发布:java 服务器 物联网 编辑:程序博客网 时间:2024/06/01 07:55




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(随机梯度下降)【这部分复制过来的】


随机梯度下降法

[cpp] view plain copy
  1. int main(void)  
  2. {  
  3.         float matrix[4][2]={{1,4},{2,5},{5,1},{4,2}};  
  4.         float result[4]={19,26,19,20};  
  5.         float theta[2]={2,5};  
  6.         float loss = 10.0;  
  7.         for(int i =0 ;i<100&&loss>0.001;++i)  
  8.         {  
  9.                 float error_sum=0.0;  
  10.                 int j=i%4;  //产生随机数j
  11.                 {  
  12.                         float h = 0.0;  
  13.                         for(int k=0;k<2;++k)  
  14.                         {  
  15.                                 h += matrix[j][k]*theta[k];  
  16.   
  17.                         }  
  18.                         error_sum = result[j]-h;  
  19.                         for(int k=0;k<2;++k)  
  20.                         {  
  21.                                 theta[k] = theta[k]+0.01*(error_sum)*matrix[j][k];  
  22.                         }  
  23.                 }  
  24.                 printf("%f,%f\n",theta[0],theta[1]);  
  25.                 float loss = 0.0;  
  26.                 for(int j = 0;j<4;++j)  //损失是指最后求出theta后,样本预测值和真实值之间的差值
  27.                 {  
  28.                         float sum=0.0;  
  29.                         for(int k = 0;k<2;++k)  
  30.                         {  
  31.   
  32.                                 sum += matrix[j][k]*theta[k];  
  33.                         }  
  34.                         loss += (sum-result[j])*(sum-result[j]);  
  35.                 }  
  36.                 printf("%f\n",loss);  
  37.         }  
  38.         return 0;  
  39. }  

0 0