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容易實現,效果也很不錯。
歡迎參與討論並關注本博客和微博以及知乎個人主頁後續內容繼續更新哦~
轉載請您尊重作者的勞動,完整保留上述文字以及文章鏈接,謝謝您的支持!