解決二分類問題時我們通常用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 次 前言 這個系列主要想能夠用數學去描述機器學習,想要學好機器學習,首先得去理解其中的數學意義,不一定要到能夠輕鬆自如的推導中間的公式,不過至少得認識這些 式子吧,不然看一些相關...