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

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折交叉验证的形式会更好)

SoftmaxMatlab中的实现可以使用以下代码: ```matlab function y = Softmax(x) ex = exp(x); y = ex / sum(ex); end ``` 这段代码定义了一个函数Softmax,它接受一个向量x作为输入,然后计算每个元素的指数(exponential)。接下来,将指数值除以所有指数的总和,得到每个元素的概率。这样,Softmax函数可以将多分类问题的输出转化为[0,1]之间且和为1的概率分布。 为了使用Softmax函数进行多分类,你可以先使用鸢尾花数据集作为示例。加载数据集并设置类别标签,然后调用Softmax函数进行分类。下面是一个示例代码: ```matlab load fisheriris; % 导入鸢尾花数据集 x = meas; y(1:50, 1) = 1; y(51:100, 1) = 2; y(101:150, 1) = 3; % 设置类别标签 [theta, accuracy] = mysoftmax(x, y, k, alpha); % 调用softmax函数进行分类,其中theta为softmax参数,accuracy为算法准确率 ``` 在这个示例中,x是特征矩阵,y是标签向量,k是分类类别数,alpha是学习率。通过调用mysoftmax函数,可以得到theta参数和算法的准确率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [深度学习(matlab)——3.多分类](https://blog.csdn.net/weixin_53947040/article/details/122633281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [softmax求解多分类问题matlab实现](https://blog.csdn.net/weixin_43244928/article/details/106629090)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值