null的专栏
Keep your eyes open and your feet moving forward. You'll find what you need.
版权声明:本文为博主原创文章,未经博主允许不得转载。
一、Softmax Regression简介
Softmax Regression是Logistic回归的推广,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;%做好数据集,添加一列为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
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
随机梯度法
- %% 随机梯度下降法(这里要用上升法)
- 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
%% 随机梯度下降法(这里要用上升法)
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
生成测试数据
- %% 计算测试数据集
- 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
%% 计算测试数据集
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
- 下一篇优化算法——梯度下降法
我的同类文章
- •机器学习算法实践——K-Means算法与图像分割2016-10-28
- •简单易学的机器学习算法——Gibbs采样2016-07-04
- •简单易学的机器学习算法——受限玻尔兹曼机RBM2016-07-26
- •简单易学的机器学习算法——Mean Shift聚类算法2016-05-12
- •图解机器学习总结——1、基本概念2016-04-09
- •简单易学的机器学习算法——Latent Dirichlet Allocation(理论篇)2016-01-25
- •简单易学的机器学习算法——Metropolis-Hastings算法2016-07-03
- •简单易学的机器学习算法——马尔可夫链蒙特卡罗方法MCMC2016-06-29
- •推荐算法——非负矩阵分解(NMF)2016-04-19
- •图解机器学习总结——2、回归2016-04-25
- •机器学习中的常见问题——损失函数2016-03-31
参考知识库
- 阿里云机器学习算法应用实践
- 数据结构与算法在实战项目中的应用
- 数据结构和算法
- 数据结构基础系列(1):数据结构和算法
- 嵌入式开发知识体系与开发入门
核心技术类目
- 个人资料
-
- 访问:441079次
- 积分:5603
- 等级:
- 排名:第3538名
- 原创:127篇
- 转载:1篇
- 译文:0篇
- 评论:270条
- 个人声明
博客的主要内容主要是自己的学习笔记,并结合个人的理解,供各位在学习过程中参考,若有疑问,欢迎提出;若有侵权,请告知博主删除,原创文章转载还请注明出处。
- 博客专栏
深度学习Deep Learning 文章:4篇
阅读:3560优化算法 文章:14篇
阅读:41080机器学习,数据挖掘算法 文章:36篇
阅读:209986
- 联系我
-
Email:zhaozhiyong1989@126.com
- 文章分类
- machine learning(50)
- Deep Learning(10)
- optimization algorithm(14)
- 论文与材料的学习笔记(33)
- Computational Advertising(3)
- NLP(2)
- Recommender System(4)
- 每周算法练习(9)
- 设计模式(1)
- Hadoop(3)
- python(13)
- C/C++(4)
- Matlab技巧(2)
- Spark(1)
- Linux(1)
- PHP(2)
- Practice in Job(1)
- Web Spider(1)
- Data Structure & Algorithm(2)
- 文章存档
- 阅读排行
- 简单易学的机器学习算法——极限学习机(ELM)(25765)
- 简单易学的机器学习算法——岭回归(Ridge Regression)(16909)
- 简单易学的机器学习算法——神经网络之BP神经网络(13850)
- 简单易学的机器学习算法——Mean Shift聚类算法(11053)
- 简单易学的机器学习算法——SVD奇异值分解(10368)
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN(8878)
- 简单易学的机器学习算法——CART之回归树(8258)
- 简单易学的机器学习算法——决策树之ID3算法(8041)
- python——时间与时间戳之间的转换(7717)
- 优化算法——人工蜂群算法(ABC)(7489)
- 评论排行
- 最新评论
- 简单易学的机器学习算法——线性支持向量机
Amiao689:请问,你的第二个代码,对应的原始数据的标签是什么样的?为什么要增加代码去特别处理?从(0,1)变为(...
- 优化算法——牛顿法(Newton Method)
qq_25203745:请教一下,在全局牛顿法中,mk的取值问题。如果条件left <= right一直没有满足,那么退出w...
- 优化算法——差分进化算法(DE)
qq_32575121:@google19890102:恩恩 谢谢,我看到的程续好多没提到这一点,以为是我想错了~
- 优化算法——差分进化算法(DE)
zhiyong_will:@qq_32575121:提供一种简单的办法:在变异后,做一个判断,若是超出了,重新生成
- 优化算法——差分进化算法(DE)
qq_32575121:楼主您好,我想知道,变异之后怎样能保证种群中的所有个体都还在取值范围内呢?我现在就是遇到这个问题。优...
- 优化算法——差分进化算法(DE)
qq_32575121:楼主您好,我想知道,变异之后怎样能保证种群中的所有个体都还在取值范围内呢?我现在就是遇到这个问题。优...
- 机器学习算法实践——K-Means算法与图像分割
zhiyong_will:@qq_34987437:上述过程中已经包含了完整的源码
- 机器学习算法实践——K-Means算法与图像分割
qq_34987437:博主你好,我是机器学习方面的新手,想实现代码增强理解,但是能力有限,想问下方便发份源码吗?10078...
- 优化算法——拟牛顿法之DFP算法
zhiyong_will:@Sunshine_in_Moon:已修复
- 优化算法——拟牛顿法之DFP算法
zhiyong_will:@q383700092:已修复
1楼 szp686886 2014-12-10 13:55发表 [回复] [引用] [举报]-
-
楼主工作找的怎么样了?签的哪里?