Softmax回归代码详解

Softmax回归代码详解

简介

Sfotmax回归分析是logistic回归分析在多个分类问题上面的发展。

Logistic回归中,训练集由m个标签样本组合构成: 

 

对于给定的测试输入  ,我们想用假设函数针对每一个类别j估算出概率值  p(y=j|x)。也就是说,我们想估计 x 的每一种分类结果出现的概率。,我们的假设函数将要输出一个   k维的向量(向量元素的和为1)来表示这   个估计的概率值。具体地说,我们的假设函数h(x)形式如下:

 

为了方便起见,我们同样使用符号theta来表示全部的模型参数。在实现Softmax回归时,将 theta用一个 k*(n+1)的矩阵来表示会很方便,该矩阵是将   按行罗列起来得到的,如下所示:

 

问题简述,结果分析,及源码:http://www.cnblogs.com/tornadomeet/archive/2013/03/23/2977621.html

Andrew ng课程连接:http://deeplearning.stanford.edu/wiki/index.php/Exercise:Softmax_Regression

 

代码详解部分

损失函数和导数代码详解

M = bsxfun(@minus,theta*data,max(theta*data, [], 1));

M = exp(M);

p = bsxfun(@rdivide, M, sum(M));

cost = -1/numCases * groundTruth(:)' * log(p(:)) +lambda/2 * sum(theta(:) .^ 2);

 

 %10个类,每行代表每一类的参数,因为输入数据为28*28=784个特征,所以每行有784个参数。

 

2.2 简化冗余参数

M =bsxfun(@minus,theta*data,max(theta*data, [], 1));%减去theta*data中结果数值最大的数,首先由于softmax模型过度参数化,参数减去一个常数多结果没有影响(详细探讨见andrew ng教程);其次,由于要对参数进行指数exp的计算,可能由于为了防止指数的值过大,所以减去一个最大的结果。

 

2.3计算每个样本的类概率

M = exp(M);

p = bsxfun(@rdivide, M, sum(M));

sum(M),对矩阵的每列进行求和;做除法后,M的每列的每个结果,除以该列的总和;这一项对概率分布进行归一化,使得所有概率之和为 1。

%每列为每个样本对10个分类的概率,共计6000个样本。

 

2.4计算损失函数

cost = -1/numCases * groundTruth(:)' * log(p(:)) +lambda/2 * sum(theta(:) .^ 2);

2.4.1构造示性函数(示性函数的矩阵表示)

groundTruth = full(sparse(labels, 1:numCases, 1));

label1=labels(1:10,1)%提取labels集合的前十个标签

 

我的疑问:按照矩阵乘法,最后的结果应该是一个6000*6000的大矩阵;但是运算结果是一个数值。

按照损失函数的公式:

 

对于每个样本,内层先遍历每个分类j从1到10;若符合标签分类,则示性函数值为1,然后取其对应的概率Pij;让后遍历第二个样本,并计算其正确分类的概率值,最后求和,作为最后损失函数值。

 按照我的理解:

 

groundTruth(:)转制后groundTruth(:)' 为6000*10的矩阵;每行大部分元素值为0,只有对应正确分类为1的示性矩阵;应该是转制后每一行与 log(p(:))的第一列对应相乘;求得样本1的损失函数值,然后示性矩阵的第二行与log(p(:))的第二例对应相乘;依照此方法计算每个样本的损失函数值,最后求和。

   但是按照matlab矩阵运算的法则,应该是6000*6000的矩阵;为啥会得到一个数值呢?难道是系数矩阵乘法的原因么,百度了一下,但是没有找到答案。求大神解答

2.5计算导数

thetagrad = -1/numCases * (groundTruth - p) * data' +lambda * theta;

这个就不解释了,看上面的代码估计就很好理解了。

posted @ 2015-11-16 21:46  菜鸡一枚  阅读(966)  评论(0编辑  收藏  举报