Softmax函数实际上是有限项离散概率分布的梯度对数归一化。因此,Softmax函数在包括多项逻辑回归,多项线性判别分析,朴素贝叶斯分类器和人工神经网络等的多种基于概率的多分类问题方法中都有着广泛应用。
本文参考博主_SherryAnna的博客:https://blog.csdn.net/zsdust/article/details/79677894
并给出其在matlab上的实现:
function [ theta, accuracy] = mysoftmax( x,y,k, alpha )
% 梯度下降法实现softmax多分类
% k为类别数
% 训练集占比为a,测试集占比1-a
a=0.2;%训练集占比
xx=[ones(size(x,1),1),x];%将x前加入一列x0
%对y进行处理
yy=zeros(size(y,1),k);
for i=1:size(y,1)
for j=1:k
if y(i,1)==j
yy(i,j)=1;
end
end
end
rowrank = randperm(size(xx, 1));
x_xin =xx(rowrank, :);
y_xin_train =yy(rowrank, :);
y_xin_test=y(rowrank, :);% 将数据集随机打乱
x_train=x_xin(1:floor(a*size(x,1)),:);
y_train=y_xin_train(1:floor(a*size(x,1)),:);
x_test=x_xin(floor(a*size(x,1))+1:size(x,1),:);
y_test=y_xin_test(floor(a*size(x,1))+1:size(x,1),:);
m=size(x_train,1);%记录训练集样本总数
n=size(x,2);%记录样本特征数
theta=ones(k,n+1);
loop_max=10000;
shunxu=randperm(m);
count=0;
% 梯度下降
while count<loop_max
count=count+1;
num=unidrnd(m);
x_i=x_train(num,:);
theta_T_x=theta*x_i';%k行m列
e_theta_T_x=exp(theta_T_x);%求指数
denominator=sum(e_theta_T_x);%计算第一项的分母
numerator=e_theta_T_x;%计算第一项的分子
gradient=(numerator/denominator-y_train(num,:)')*x_i;%计算J的偏导数
theta=theta-alpha*gradient/m;
if all (abs(gradient)<0.001)
break
end
end
count=0;%记录错误的样本数
predict=theta*x_test';
for i=1:size(x_test,1)
[belief(i),class(i)]=max(predict(:,i));
if class(i) == y_test(i)
count=count+1;
end
end
accuracy=count/size(x_test,1);
end
算法调用(以鸢尾花数据集为例)
load fisheriris;%导入matlab自带的鸢尾花数据集
x=meas;
y(1:50,1)=1;
y(51:100,1)=2;
y(101:150,1)=3;%一共是三个类别
[ theta, accuracy] = mysoftmax( x,y,k, alpha );
%theta为sofamax参数,accuracy为算法准确率
经测试,当取50%的样本作为训练集时,准确率最高可达100%(每次的准确率不同)
(如果改成k折交叉验证的形式会更好)