二分类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;
}