二分类logistics回归的时候,我们用了一个theta,其中theta是n维,n取决于样本x有几维
以此类推,当三分类softmax的时候,我们就用两个theta,一个是划分为1的theta,一个是划分为2的theta,一个是1减去他俩
所以说,theta1就代表了分类里,结果为第一类的作用的那个theta。theta2代表第二类作用为2的那个theta
因此,我们求出theta1*样本xi,然后把所有theta求和作为分母,就可以得到一个x分类为类别l的概率
之后,我们梯度下降是要求导的。梯度方向怎么算?
最底下的一行就说明了,我们用softmax法代码写的时候,就用这个示性函数减去P值,乘以这个样本x【的所有值】
这个跟logistics回归的区别?
区别:logistics是二分类,只有一个theta,判断的时候,不用判断if(result【i】==1)这种
最后,代码风格和前几个类似,有几点不同:
1.要去计算p值。p值的计算方法是e^(h(xi))/归一化加和再加一(注意!归一化加和的时候,根据NG的讲义,每个p值是归一化加和再加一【否则faiK就铁定是0了】
2.theta不再是一个一维数组了,而是一个k-1(二元logistics一个theta,三元两个theta,k元k-1个theta)【k是要分的多项式维度】*m【m是x的维度】的一个矩阵了。所以,在写代码的时候,要多一个for
3.在用梯度下降更新的时候,需要根据y值的多分类情况写一个if来分别更新,即:y值是哪个值,就更新哪个theta
#include<stdio.h>
#include<math.h>
double ex(double x)
{
return pow(2.718,x);
}
int main()
{
int i,j,k,l,t,z;
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}};
double totalsum;
double sum[2] = {0,0};
double p[3];
for(i=1;i<1000;i++)
{
for(j=0;j<9;j++)
{
totalsum=0;
for(l=0;l<2;l++)
{
sum[l]=0;
for(k=0;k<4;k++)
{
sum[l]+=matrix[j][k]*theta[l][k];
}
p[l]=ex(sum[l]);
totalsum+=ex(sum[l]);
}
//p是在j里面算的,因为每个样本都是跟p有关的,各不相同
for(l=0;l<2;l++)
{
p[l] = p[l]/(totalsum+1);
//printf("样本%d的第%d个概率为%lf\t",j,l+1,p[l]);
}
p[2]= 1-p[0]-p[1];//其实p2不用算,用不到。。
//printf("样本%d的第3个概率为%lf\t",j,p[2]);
//算出p就可以更新了。。
for(k=0;k<4;k++)
{
if(result[j]==1)
theta[0][k]+=0.001*(1-p[0])*matrix[j][k];
else
theta[0][k]+=0.001*(-p[0])*matrix[j][k];
if(result[j]==2)
theta[1][k]+=0.001*(1-p[1])*matrix[j][k];
else
theta[1][k]+=0.001*(-p[1])*matrix[j][k];
}
}
for(t=0;t<2;t++)
{
for(z=0;z<4;z++)
printf("theta%d%d=%lf ",t,z,theta[t][z]);
printf("\n");
}
}
}
跟同学run的结果不一样。先保留着
20191124更新:
看了自己之前的理解,回看下知识并没有串起来;
最简单的一个问题就是『什么时候使用逻辑回归的softmax解决多分类问题,什么时候用线性回归来解决多分类问题』
第二个问题是『这个softmax和OVR(OVA),OVO』有什么关系?
现在回看了一下,其实softmax解决的是,『逻辑回归』的『OVA』的『多分类』问题,使用场景为:问题有多个类别,且、多个类别互相无关系(年龄,身高,预测不同的word-vector这种无序的东西,不能用1分2分3分这种,业务上认为有序的东西【取决于你对业务的抽象和理解】)如果是有序的 推荐组pair进行逻辑回归,或是直接pointwise处理