softmax自己理解

二分类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处理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值