简单易学的机器学习算法——Softmax Regression

简单易学的机器学习算法——Softmax Regression

标签: 机器学习SoftmaxLogistic
2752人阅读 评论(1) 收藏 举报
本文章已收录于:
分类:

一、Softmax Regression简介

        Softmax RegressionLogistic回归的推广,Logistic回归是处理二分类问题的,而Softmax Regression是处理多分类问题的。Logistic回归是处理二分类问题的比较好的算法,具有很多的应用场合,如广告计算等。Logistic回归利用的是后验概率最大化的方式去计算权重。

二、Logistic回归的回顾

    在Logistic回归中比较重要的有两个公式,一个是阶跃函数:

 

另一个是对应的损失函数

 

最终,Logistic回归需要求出的是两个概率:。具体的Logistic回归的过程可参见“简单易学的机器学习算法——Logistic回归”。

三、Logistic回归的推广——Softmax Regression

    在Logistic回归需要求解的是两个概率,而在Softmax Regression中将不是两个概率,而是个概率,表示的是分类的个数。我们需要求出以下的概率值:

 

此时的损失函数为

 

其中是一个指示性函数,意思是大括号里的值为真时,该函数的结果为1,否则为0。下面就这几个公式做个解释:

1、损失函数的由来

   概率函数可以表示为

其似然函数为

 

似然为

 

我们要最大化似然函数,即求再转化成损失函数。

2、对 似然(或者是损失函数)求偏导

   为了简单,我们仅取一个样本,则可简单表示为

 

下面对求偏导:

 

其中,表示第维。如Logistic回归中一样,可以使用基于梯度的方法来求解这样的最大化问题。基于梯度的方法可以参见“优化算法——梯度下降法”。

四、实验

1、训练数据

   从图上我们可以看到分为4类。

2、测试数据

在区间上随机生成了4000个点,这样比较直观地看到分类边界。

3、Matlab源码

主程序

  1. clear all;  
  2. clc;  
  3.   
  4. %% 导入数据  
  5. data = load('SoftInput.txt');  
  6. [m,n] = size(data);  
  7. labels = unique(data(:,3));  
  8. labelLen = length(labels);%划分的种类  
  9. dataMat(:,2:3) = data(:,1:2);  
  10. dataMat(:,1) = 1;%做好数据集,添加一列为1  
  11. labelMat(:,1) = data(:,3)+1;%分类的标签  
  12. %% 画图  
  13. figure;  
  14. hold on  
  15. for i = 1:m  
  16.     if labelMat(i,:) == 1  
  17.         plot(data(i,1),data(i,2),'.m');%粉红色  
  18.     elseif labelMat(i,:) == 2  
  19.         plot(data(i,1),data(i,2),'.b');%蓝色  
  20.     elseif labelMat(i,:) == 3  
  21.         plot(data(i,1),data(i,2),'.r');%红色  
  22.     else  
  23.         plot(data(i,1),data(i,2),'.k');%黑色  
  24.     end  
  25. end  
  26. title('原始数据集');  
  27. hold off  
  28.   
  29. %% 初始化一些参数  
  30. M = m;%数据集的行  
  31. N = n;%数据集的列  
  32. K = labelLen;%划分的种类  
  33. alpha = 0.001;%学习率  
  34. weights = ones(N, K);%初始化权重  
  35.   
  36. %% 利用随机梯度修改权重  
  37. weights = stochasticGradientAscent(dataMat, labelMat, M, weights, alpha);  
  38.   
  39. %% 测试数据集(主要在区间里随机生成)  
  40. size = 4000;  
  41. [testDataSet, testLabelSet] = testData(weights, size, N);  
  42. %% 画出最终的分类图  
  43. figure;  
  44. hold on  
  45. for i = 1:size  
  46.     if testLabelSet(i,:) == 1  
  47.         plot(testDataSet(i,2),testDataSet(i,3),'.m');  
  48.     elseif testLabelSet(i,:) == 2  
  49.         plot(testDataSet(i,2),testDataSet(i,3),'.b');  
  50.     elseif testLabelSet(i,:) == 3  
  51.         plot(testDataSet(i,2),testDataSet(i,3),'.r');  
  52.     else  
  53.         plot(testDataSet(i,2),testDataSet(i,3),'.k');  
  54.     end  
  55. end  
  56. title('测试数据集');  
  57. hold off  
clear all;
clc;

%% 导入数据
data = load('SoftInput.txt');
[m,n] = size(data);
labels = unique(data(:,3));
labelLen = length(labels);%划分的种类
dataMat(:,2:3) = data(:,1:2);
dataMat(:,1) = 1;%做好数据集,添加一列为1
labelMat(:,1) = data(:,3)+1;%分类的标签
%% 画图
figure;
hold on
for i = 1:m
    if labelMat(i,:) == 1
        plot(data(i,1),data(i,2),'.m');%粉红色
    elseif labelMat(i,:) == 2
        plot(data(i,1),data(i,2),'.b');%蓝色
    elseif labelMat(i,:) == 3
        plot(data(i,1),data(i,2),'.r');%红色
    else
        plot(data(i,1),data(i,2),'.k');%黑色
    end
end
title('原始数据集');
hold off

%% 初始化一些参数
M = m;%数据集的行
N = n;%数据集的列
K = labelLen;%划分的种类
alpha = 0.001;%学习率
weights = ones(N, K);%初始化权重

%% 利用随机梯度修改权重
weights = stochasticGradientAscent(dataMat, labelMat, M, weights, alpha);

%% 测试数据集(主要在区间里随机生成)
size = 4000;
[testDataSet, testLabelSet] = testData(weights, size, N);
%% 画出最终的分类图
figure;
hold on
for i = 1:size
    if testLabelSet(i,:) == 1
        plot(testDataSet(i,2),testDataSet(i,3),'.m');
    elseif testLabelSet(i,:) == 2
        plot(testDataSet(i,2),testDataSet(i,3),'.b');
    elseif testLabelSet(i,:) == 3
        plot(testDataSet(i,2),testDataSet(i,3),'.r');
    else
        plot(testDataSet(i,2),testDataSet(i,3),'.k');
    end
end
title('测试数据集');
hold off


随机梯度法

  1. %% 随机梯度下降法(这里要用上升法)  
  2. function [ weights ] = stochasticGradientAscent( dataMat, labelMat, M, weights, alpha )  
  3.     for step = 1:500  
  4.         for i = 1:M%对每一个样本  
  5.             pop = exp(dataMat(i,:)*weights);%计算概率  
  6.             popSum = sum(pop);%分母  
  7.             pop = -pop/popSum;%求好概率  
  8.             pop(:,labelMat(i)) = pop(:,labelMat(i))+1;%加1的操作  
  9.             weights = weights + alpha*dataMat(i,:)'*pop;  
  10.         end  
  11.     end  
  12. end  
%% 随机梯度下降法(这里要用上升法)
function [ weights ] = stochasticGradientAscent( dataMat, labelMat, M, weights, alpha )
    for step = 1:500
        for i = 1:M%对每一个样本
            pop = exp(dataMat(i,:)*weights);%计算概率
            popSum = sum(pop);%分母
            pop = -pop/popSum;%求好概率
            pop(:,labelMat(i)) = pop(:,labelMat(i))+1;%加1的操作
            weights = weights + alpha*dataMat(i,:)'*pop;
        end
    end
end


生成测试数据

  1. %% 计算测试数据集  
  2. function [ testDataSet, testLabelSet ] = testData( weights, m, n)  
  3.     testDataSet = ones(m,n);%构建了全1的矩阵  
  4.     testLabelSet = zeros(m,1);  
  5.     for i = 1:m  
  6.         testDataSet(i,2) = rand()*6-3;  
  7.         testDataSet(i,3) = rand()*15;  
  8.     end  
  9.       
  10.     %% 计算测试数据的所属分类  
  11.     for i = 1:m  
  12.         testResult = testDataSet(i,:)*weights;  
  13.         [C,I] = max(testResult);  
  14.         testLabelSet(i,:) = I;  
  15.     end  
  16. end  
%% 计算测试数据集
function [ testDataSet, testLabelSet ] = testData( weights, m, n)
    testDataSet = ones(m,n);%构建了全1的矩阵
    testLabelSet = zeros(m,1);
    for i = 1:m
        testDataSet(i,2) = rand()*6-3;
        testDataSet(i,3) = rand()*15;
    end
    
    %% 计算测试数据的所属分类
    for i = 1:m
        testResult = testDataSet(i,:)*weights;
        [C,I] = max(testResult);
        testLabelSet(i,:) = I;
    end
end


 

 

 

 

0
0
 
 
我的同类文章

参考知识库

img
机器学习知识库

img
软件测试知识库

img
算法与数据结构知识库

更多资料请参考:
猜你在找
阿里云机器学习算法应用实践
数据结构与算法在实战项目中的应用
数据结构和算法
数据结构基础系列(1):数据结构和算法
嵌入式开发知识体系与开发入门
查看评论
1楼 szp686886 2014-12-10 13:55发表 [回复] [引用] [举报]
楼主工作找的怎么样了?签的哪里?
发表评论
  • 用 户 名:
  • liqing199
  •   
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
  • 个人资料
    • 访问:441079次
    • 积分:5603
    • 等级:
      积分:5603
    • 排名:第3538名
    • 原创:127篇
    • 转载:1篇
    • 译文:0篇
    • 评论:270条
  • 个人声明
  • 博客的主要内容主要是自己的学习笔记,并结合个人的理解,供各位在学习过程中参考,若有疑问,欢迎提出;若有侵权,请告知博主删除,原创文章转载还请注明出处。

  • 博客专栏
  • 联系我
  • Email:zhaozhiyong1989@126.com

  • 最新评论
您有 0条新通知
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值