3、softmax回归 C代码

二分类logistics回归的时候,我们用了一个theta,其中theta是n维,n取决于样本x有几维

以此类推,当三分类softmax的时候,我们就用两个theta,一个是划分为1的theta,一个是划分为2的theta,一个是1减去他俩

所以说,theta1就代表了分类里,结果为第一类的作用的那个theta。theta2代表第二类作用为2的那个theta


可以写成【NG视频里说的】

                 (**)

因此,我们求出theta1*样本xi,然后把所有theta求和作为分母,就可以得到一个x分类为类别l的概率



#include "stdio.h"
#include "math.h"


double matrix[9][4]={{1,47,76,24}, //include x0=1
              {1,46,77,23},
              {1,48,74,22},
              {1,34,76,21},
              {1,35,75,24},
              {1,34,77,25},
              {1,55,76,21},
              {1,56,74,22},
              {1,55,72,22},
                };


double result[]={1,
                 1,
                 1,
                 2,
                 2,
                 2,
                 3,
                 3,
                 3,};

double theta[2][4]={
                 {0.3,0.3,0.01,0.01},
                 {0.5,0.5,0.01,0.01}}; // include theta0
double x,sum,h,h1,h2,p1,p2,p3;
int i,j,k,l;

double fun_ex(x){
    return pow(2.718,x) ;
}
int main(){
for(i=1;i<100;i++){
  for(j=0;j<9;j++){
    sum=1;      //公式上加1了,这个要注意,看上面式子(**)
     for(l=0;l<2;l++){
       h=0;
          for(k=0;k<4;k++){
             h=h+theta[l][k]*matrix[j][k];
           }
          sum=sum+fun_ex(h);
      }
       //求p1,p2,p3,这个也可以在之前的循环中求出,有空可以试试
      h1=0;
      for(k=0;k<4;k++){
          h1=h1+theta[0][k]*matrix[j][k];
      }
      p1=fun_ex(h1)/sum;
      h2=0;
      for(k=0;k<4;k++){
          h2=h2+theta[1][k]*matrix[j][k];
      }
      p2=fun_ex(h2)/sum;
      p3=1-p1-p2;

      //判断指示函数值,学习theta
      for(k=0;k<4;k++){
         if(result[j]==1){
         theta[0][k]=theta[0][k]+0.001*(1-p1)*matrix[j][k];
         }else{
         theta[0][k]=theta[0][k]+0.001*(-p1)*matrix[j][k];
         }


         if(result[j]==2){
         theta[1][k]=theta[1][k]+0.001*(1-p2)*matrix[j][k];
         }else{
         theta[1][k]=theta[1][k]+0.001*(-p2)*matrix[j][k];
         }
      }
      //输出theta

   }
   //注意:放在最外面输出
     printf("p1=%lf p2=%lf p3=%lf\n",p1,p2,p3);
     for(k=0;k<4;k++){
         for(l=0;l<2;l++) {
            printf("theta[%d][%d]=%lf ",l,k,theta[l][k]);
          }
      }
      printf("\n");
}


return 0;
}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值