日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

梯度下降法实现softmax回归MATLAB程序

發(fā)布時(shí)間:2024/3/26 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 梯度下降法实现softmax回归MATLAB程序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

梯度下降法實(shí)現(xiàn)softmax回歸MATLAB程序

版權(quán)聲明:本文原創(chuàng),轉(zhuǎn)載須注明來(lái)源。

解決二分類(lèi)問(wèn)題時(shí)我們通常用Logistic回歸,而解決多分類(lèi)問(wèn)題時(shí)若果用Logistic回歸,則需要設(shè)計(jì)多個(gè)分類(lèi)器,這是相當(dāng)麻煩的事情。softmax回歸可以看做是Logistic回歸的普遍推廣(Logistic回歸可看成softmax回歸在類(lèi)別數(shù)為2時(shí)的特殊情況),在多分類(lèi)問(wèn)題上softmax回歸是一個(gè)有效的工具。

關(guān)于softmax回歸算法的理論知識(shí)可參考這兩篇博文:http://deeplearning.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92 ;
http://blog.csdn.net/acdreamers/article/details/44663305 。

本文自編mysoftmax_gd函數(shù)用于實(shí)現(xiàn)梯度下降softmax回歸,代碼如下(鏈接:http://pan.baidu.com/s/1geF2WMJ 密碼:9x3x):

MATLAB程序代碼:

function [theta,test_pre,rate] = mysoftmax_gd(X_test,X,label,lambda,alpha,MAX_ITR,varargin) % 該函數(shù)用于實(shí)現(xiàn)梯度下降法softmax回歸 % 調(diào)用方式:[theta,test_pre,rate] = mysoftmax_gd(X_test,X,label,lambda,alpha,MAX_ITR,varargin) % X_test:測(cè)試輸入數(shù)據(jù) % X:訓(xùn)練輸入數(shù)據(jù),組織為m*p矩陣,m為案例個(gè)數(shù),p為加上常數(shù)項(xiàng)之后的屬性個(gè)數(shù) % label:訓(xùn)練數(shù)據(jù)標(biāo)簽,組織為m*1向量(數(shù)值型) % lambda:權(quán)重衰減參數(shù)weight decay parameter % alpha:梯度下降學(xué)習(xí)速率 % MAX_ITR:最大迭代次數(shù) % varargin:可選參數(shù),輸入初始迭代的theta系數(shù),若不輸入,則默認(rèn)隨機(jī)選取 % theta:梯度下降法的theta系數(shù)尋優(yōu)結(jié)果 % test_pre:測(cè)試數(shù)據(jù)預(yù)測(cè)標(biāo)簽 % rata:訓(xùn)練數(shù)據(jù)回判正確率% Genlovy Hoo,2016.06.29. genlovhyy@163.com %% 梯度下降尋優(yōu) Nin=length(varargin); if Nin>1error('輸入太多參數(shù)') % 若可選輸入?yún)?shù)超過(guò)1個(gè),則報(bào)錯(cuò) end [m,p] = size(X); numClasses = length(unique(label)); % 求取標(biāo)簽類(lèi)別數(shù) if Nin==0theta = 0.005*randn(p,numClasses); % 若沒(méi)有輸入可選參數(shù),則隨機(jī)初始化系數(shù) elsetheta=varargin{1}; % 若有輸入可選參數(shù),則將其設(shè)定為初始theta系數(shù) end cost=zeros(MAX_ITR,1); % 用于追蹤代價(jià)函數(shù)的值 for k=1:MAX_ITR[cost(k),grad] = softmax_cost_grad(X,label,lambda,theta); % 計(jì)算代價(jià)函數(shù)值和梯度theta=theta-alpha*grad; % 更新系數(shù) end %% 回判預(yù)測(cè) [~,~,Probit] = softmax_cost_grad(X,label,lambda,theta); [~,label_pre] = max(Probit,[],2); index = find(label==label_pre); % 找出預(yù)測(cè)正確的樣本的位置 rate = length(index)/m; % 計(jì)算預(yù)測(cè)精度 %% 繪制代價(jià)函數(shù)圖 figure('Name','代價(jià)函數(shù)值變化圖'); plot(0:MAX_ITR-1,cost) xlabel('迭代次數(shù)'); ylabel('代價(jià)函數(shù)值') title('代價(jià)函數(shù)值變化圖');% 繪制代價(jià)函數(shù)值變化圖 %% 測(cè)試數(shù)據(jù)預(yù)測(cè) [mt,pt] = size(X_test); Probit_t = zeros(mt,length(unique(label))); for smpt = 1:mtProbit_t(smpt,:) = exp(X_test(smpt,:)*theta)/sum(exp(X_test(smpt,:)*theta)); end [~,test_pre] = max(Probit_t,[],2); function [cost,thetagrad,P] = softmax_cost_grad(X,label,lambda,theta) % 用于計(jì)算代價(jià)函數(shù)值及其梯度 % X:m*p輸入矩陣,m為案例個(gè)數(shù),p為加上常數(shù)項(xiàng)之后的屬性個(gè)數(shù) % label:m*1標(biāo)簽向量(數(shù)值型) % lambda:權(quán)重衰減參數(shù)weight decay parameter % theta:p*k系數(shù)矩陣,k為標(biāo)簽類(lèi)別數(shù) % cost:總代價(jià)函數(shù)值 % thetagrad:梯度矩陣 % P:m*k分類(lèi)概率矩陣,P(i,j)表示第i個(gè)樣本被判別為第j類(lèi)的概率 m = size(X,1); % 將每個(gè)標(biāo)簽擴(kuò)展為一個(gè)k維橫向量(k為標(biāo)簽類(lèi)別數(shù)),若樣本i屬于第j類(lèi),則 % label_extend(i,j)= 1,否則label_extend(i,j)= 0。 label_extend = [full(sparse(label,1:length(label),1))]'; % 計(jì)算預(yù)測(cè)概率矩陣 P = zeros(m,size(label_extend,2)); for smp = 1:mP(smp,:) = exp(X(smp,:)*theta)/sum(exp(X(smp,:)*theta)); end % 計(jì)算代價(jià)函數(shù)值 cost = -1/m*[label_extend(:)]'*log(P(:))+lambda/2*sum(theta(:).^2); % 計(jì)算梯度 thetagrad = -1/m*X'*(label_extend-P)+lambda*theta; clear clc close all load fisheriris % MATLAB自帶數(shù)據(jù)集 % 對(duì)標(biāo)簽重新編號(hào)并準(zhǔn)備訓(xùn)練/測(cè)試數(shù)據(jù)集 index_train = [1:40,51:90,101:140]; index_test = [41:50,91:100,141:150]; species_train = species(index_train); X=[ones(length(species_train),1),meas(index_train,:)]; label = zeros(size(species_train)); label(strcmp('setosa',species_train)) = 1; label(strcmp('versicolor',species_train)) = 2; label(strcmp('virginica',species_train)) = 3; species_test = species(index_test); X_test = [ones(length(species_test),1),meas(index_test,:)]; lambda = 0.004; % 權(quán)重衰減參數(shù)Weight decay parameter alpha = 0.1; % 學(xué)習(xí)速率 MAX_ITR=500; % 最大迭代次數(shù) [theta,test_pre,rate] = mysoftmax_gd(X_test,X,label,lambda,alpha,MAX_ITR) clear clc close all load MNISTdata % MNIST數(shù)據(jù)集 % 準(zhǔn)備訓(xùn)練/測(cè)試數(shù)據(jù)集 label = labels(1:9000); % 訓(xùn)練集標(biāo)簽 X = [ones(length(label),1),[inputData(:,1:9000)]']; % 訓(xùn)練集輸入數(shù)據(jù) label_test = labels(9001:end); % 測(cè)試集標(biāo)簽 X_test = [ones(length(label_test),1),[inputData(:,9001:end)]']; % 測(cè)試輸入數(shù)據(jù) lambda = 0.004; % 權(quán)重衰減參數(shù)Weight decay parameter alpha = 0.1; % 學(xué)習(xí)速率 MAX_ITR=100; % 最大迭代次數(shù) [theta,test_pre,rate] = mysoftmax_gd(X_test,X,label,lambda,alpha,MAX_ITR) index_t = find(label_test==test_pre); % 找出預(yù)測(cè)正確的樣本的位置 rate_test = length(index_t)/length(label_test); % 計(jì)算預(yù)測(cè)精度

水平有限,敬請(qǐng)指正交流。genlovhyy@163.com 。

參考資料:
【1】:http://deeplearning.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92
【2】:http://blog.csdn.net/acdreamers/article/details/44663305

總結(jié)

以上是生活随笔為你收集整理的梯度下降法实现softmax回归MATLAB程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。