梯度下降法實現softmax回歸MATLAB程式

2021-07-14 04:43:38 字數 4361 閱讀 6784

解決二分類問題時我們通常用logistic回歸,而解決多分類問題時若果用logistic回歸,則需要設計多個分類器,這是相當麻煩的事情。softmax回歸可以看做是logistic回歸的普遍推廣(logistic回歸可看成softmax回歸在類別數為2時的特殊情況),在多分類問題上softmax回歸是乙個有效的工具。

關於softmax回歸演算法的理論知識可參考這兩篇博文: ;

function

[theta,test_pre,rate] = mysoftmax_gd

(x_test,x,label,lambda,alpha,max_itr,varargin)

% 該函式用於實現梯度下降法softmax回歸

% 呼叫方式:[theta,test_pre,rate] = mysoftmax_gd(x_test,x,label,lambda,alpha,max_itr,varargin)

% x_test:測試輸入資料

% x:訓練輸入資料,組織為m*p矩陣,m為案例個數,p為加上常數項之後的屬性個數

% label:訓練資料標籤,組織為m*1向量(數值型)

% lambda:權重衰減引數weight decay parameter

% alpha:梯度下降學習速率

% max_itr:最大迭代次數

% varargin:可選引數,輸入初始迭代的theta係數,若不輸入,則預設隨機選取

% theta:梯度下降法的theta係數尋優結果

% test_pre:測試資料**標籤

% rata:訓練資料回判正確率

% genlovy hoo,2016.06.29. [email protected]

%% 梯度下降尋優

nin=length(varargin);

if nin>1

error('輸入太多引數') % 若可選輸入引數超過1個,則報錯

end[m,p] = size(x);

numclasses = length(unique(label)); % 求取標籤類別數

if nin==0

theta = 0.005*randn(p,numclasses); % 若沒有輸入可選引數,則隨機初始化係數

else

theta=varargin; % 若有輸入可選引數,則將其設定為初始theta係數

endcost=zeros(max_itr,1); % 用於追蹤代價函式的值

for k=1:max_itr

[cost(k),grad] = softmax_cost_grad(x,label,lambda,theta); % 計算代價函式值和梯度

theta=theta-alpha*grad; % 更新係數

end%% 回判**

[~,~,probit] = softmax_cost_grad(x,label,lambda,theta);

[~,label_pre] = max(probit,,2);

index = find(label==label_pre); % 找出**正確的樣本的位置

rate = length(index)/m; % 計算**精度

%% 繪製代價函式圖

figure('name','代價函式值變化圖');

plot(0:max_itr-1,cost)

xlabel('迭代次數'); ylabel('代價函式值')

title('代價函式值變化圖');% 繪製代價函式值變化圖

%% 測試資料**

[mt,pt] = size(x_test);

probit_t = zeros(mt,length(unique(label)));

for smpt = 1:mt

probit_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)

% 用於計算代價函式值及其梯度

% x:m*p輸入矩陣,m為案例個數,p為加上常數項之後的屬性個數

% label:m*1標籤向量(數值型)

% lambda:權重衰減引數weight decay parameter

% theta:p*k係數矩陣,k為標籤類別數

% cost:總代價函式值

% thetagrad:梯度矩陣

% p:m*k分類概率矩陣,p(i,j)表示第i個樣本被判別為第j類的概率

m = size(x,1);

% 將每個標籤擴充套件為乙個k維橫向量(k為標籤類別數),若樣本i屬於第j類,則

% label_extend(i,j)= 1,否則label_extend(i,j)= 0。

label_extend = [full(sparse(label,1:length(label),1))]';

% 計算**概率矩陣

p = zeros(m,size(label_extend,2));

for smp = 1:m

p(smp,:) = exp(x(smp,:)*theta)/sum(exp(x(smp,:)*theta));

end% 計算代價函式值

cost = -1/m*[label_extend(:)]'*log(p(:))+lambda/2*sum(theta(:).^2);

% 計算梯度

thetagrad = -1/m*x'*(label_extend-p)+lambda*theta;

clear

clcclose all

load fisheriris % matlab自帶資料集

% 對標籤重新編號並準備訓練/測試資料集

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; % 權重衰減引數weight decay parameter

alpha = 0.1; % 學習速率

max_itr=500; % 最大迭代次數

[theta,test_pre,rate] = mysoftmax_gd(x_test,x,label,lambda,alpha,max_itr)

clear

clcclose all

load mnistdata % mnist資料集

% 準備訓練/測試資料集

label = labels(1:9000); % 訓練集標籤

x = [ones(length(label),1),[inputdata(:,1:9000)]']; % 訓練集輸入資料

label_test = labels(9001:end); % 測試集標籤

x_test = [ones(length(label_test),1),[inputdata(:,9001:end)]']; % 測試輸入資料

lambda = 0.004; % 權重衰減引數weight decay parameter

alpha = 0.1; % 學習速率

max_itr=100; % 最大迭代次數

[theta,test_pre,rate] = mysoftmax_gd(x_test,x,label,lambda,alpha,max_itr)

index_t = find(label_test==test_pre); % 找出**正確的樣本的位置

rate_test = length(index_t)/length(label_test); % 計算**精度

水平有限,敬請指正交流。[email protected]

參考資料: ::

梯度下降法和隨機梯度下降法

批量梯度下降法 batch gradient descent 在更新引數時使用所有的樣本來進行更新 隨機梯度下降法 stochastic gradient descent 求梯度時沒有用所有的m個樣本的資料,而是僅僅選取乙個樣本j來求梯度。小批量梯度下降法 mini batch gradient d...

梯度下降法

梯度下降法 是乙個一階 最優化演算法 通常也稱為 最速下降法 我之前也沒有關注過這類演算法。最近,聽史丹福大學的機器學習課程時,碰到了用梯度下降演算法求解線性回歸問題,於是看了看這類演算法的思想。今天只寫了一些入門級的知識。我們知道,函式的曲線如下 程式設計實現 c code cpp view pl...

梯度下降法

回歸 regression 梯度下降 gradient descent 發表於332 天前 技術,科研 被圍觀 1152 次 前言 這個系列主要想能夠用數學去描述機器學習,想要學好機器學習,首先得去理解其中的數學意義,不一定要到能夠輕鬆自如的推導中間的公式,不過至少得認識這些 式子吧,不然看一些相關...