Softmax回归就是推广版本的逻辑回归。
只不过逻辑回归是个2分类问题,而Softmax是多分类问题,仅此而已。
Softmax回归在2分类情况下就蜕化成了逻辑回归。
逻辑回归的代价函数
考虑到权重衰减,修改一下就是Softmax回归的代价函数了
这里的权重衰减项是必须的,因为原先的代价函数不是严格凸函数,有无穷个极小值。现在加了这个权重衰减项,函数变成了严格凸函数。L-BFGS算法可以保证收敛得到全局最优解。
新函数的导数如下
接下来就是编程了,要注意几个小问题
1.要把以下文件也存入路径,以便调用:
computeNumericalGradient loadMNISTImages loadMNISTLabels train-images.idx3-ubyte train-labels.idx1-ubyte minFunc</span>
2.主程序里面数据文件的名字需要修改
改为
train-images.idx3-ubyte/train-labels.idx1-ubyte</span>
3.注意几个重要矩阵的维数
data:784*60000 theta:10*784 M:10*60000 groundtruth:10*60000</span>
4.善用bsxfun函数,少占内存,提高速度。
5.注意使用防止数据溢出的处理方式。
6.gred记录最大概率出现的序号,而不是数值。
7.老生常谈,矢量化编程。
下面给出核心代码:
SoftmaxCost
M=theta*data;%得到加权数据矩阵 M=bsxfun(@minus, M, max(M, [], 1));%防止数据溢出 hypothesis=bsxfun(@rdivide,exp(M),sum(exp(M)));%得到概率矩阵 cost=-(groundTruth(:)'*log(hypothesis(:)))/numCases+lambda/2*sumsqr(theta);%代价函数 thetagrad=-(groundTruth-hypothesis)*data'/numCases+lambda*theta;%梯度函数</span>
SoftmaxPredict
[~,pred]= max(theta*data);%记录最大概率的序号而不是最大值</span>
Accuracy: 93.272%,可以看出Softmax容易实现,效果也很不错。
欢迎参与讨论并关注本博客和微博以及知乎个人主页后续内容继续更新哦~
转载请您尊重作者的劳动,完整保留上述文字以及文章链接,谢谢您的支持!