softmax求解多分类问题的matlab实现

本文介绍Softmax函数在多项逻辑回归、多项线性判别分析、朴素贝叶斯分类器和人工神经网络等多分类问题中的应用,并提供基于Matlab的实现代码,通过梯度下降法实现Softmax多分类,以鸢尾花数据集为例,展示算法准确率可达100%。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Softmax函数实际上是有限项离散概率分布的梯度对数归一化。因此,Softmax函数在包括多项逻辑回归,多项线性判别分析,朴素贝叶斯分类器和人工神经网络等的多种基于概率的多分类问题方法中都有着广泛应用。
本文参考博主_SherryAnna的博客:https://blog.youkuaiyun.com/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折交叉验证的形式会更好)

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值