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

来源:互联网 发布:java 获取post还是get 编辑:程序博客网 时间:2024/04/29 17:23

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

主程序

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;%做好数据集,添加一列为1labelMat(:,1) = data(:,3)+1;%分类的标签%% 画图figure;hold onfor 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');%黑色    endendtitle('原始数据集');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 onfor 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');    endendtitle('测试数据集');hold off


随机梯度法

%% 随机梯度下降法(这里要用上升法)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    endend


生成测试数据

%% 计算测试数据集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;    endend


 

 

 

 

1 0
原创粉丝点击