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

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

一、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  

转自:http://blog.csdn.net/google19890102/article/details/41594889
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值