关于matlab的机器学习练手小项目中逻辑回归在matlab中编程的问题

本作业使用逻辑回归(logistic regression)和神经网络(neural networks)识别手写的阿拉伯数字(0-9)
关于逻辑回归的一个编程练习,可参考:
下面使用逻辑回归实现多分类问题:识别手写的阿拉伯数字(0-9),使用神经网络实现:识别手写的阿拉伯数字(0-9),请参考:
数据加载到Matlab中的格式如下:
一共有5000个训练样本,每个训练样本是400维的列向量(20X20像素的 grayscale image),用矩阵 X 保存。样本的结果(label of training set)保存在向量 y 中,y 是一个5000行1列的列向量。
比如 y = (1,2,3,4,5,6,7,8,9,10......)T,注意,由于Matlab下标是从1开始的,故用 10 表示数字 0
①样本数据的可视化
随机选择100个样本数据,使用Matlab可视化的结果如下:
&②使用逻辑回归来实现多分类问题(one-vs-all)
所谓多分类问题,是指分类的结果为三类以上。比如,预测明天的天气结果为三类:晴(用y==1表示)、阴(用y==2表示)、雨(用y==3表示)
分类的思想,其实与逻辑回归分类(默认是指二分类,binary classification)很相似,对“晴天”进行分类时,将另外两类(阴天和下雨)视为一类:(非晴天),这样,就把一个多分类问题转化成了二分类问题。示意图如下:(图中的圆圈 表示:不属于某一类的 所有其他类)
对于N分类问题(N&=3),就需要N个假设函数(预测模型),也即需要N组模型参数θ(θ一般是一个向量)
然后,对于每个样本实例,依次使用每个模型预测输出,选取输出值最大的那组模型所对应的预测结果作为最终结果。
因为模型的输出值,在sigmoid函数作用下,其实是一个概率值。,注意:hθ(1)(x),hθ(2)(x),hθ(3)(x)三组 模型参数θ 一般是不同的。比如:
hθ(1)(x),输出 预测为晴天(y==1)的概率
hθ(2)(x),输出 预测为阴天(y==2)的概率
hθ(3)(x),输出 预测为雨天(y==3)的概率
③Matlab代码实现
对于上面的识别阿拉伯数字的问题,一共需要训练出10个逻辑回归模型,每个逻辑回归模型对应着识别其中一个数字。
我们一共有5000个样本,样本的预测结果值就是:y=(1,2,3,4,5,6,7,8,9,10),其中 10 代表 数字0
我们使用Matlab fmincg库函数 来求解使得代价函数取最小值的 模型参数θ
function [all_theta] = oneVsAll(X, y, num_labels, lambda)
%ONEVSALL trains multiple logistic regression classifiers and returns all
%the classifiers in a matrix all_theta, where the i-th row of all_theta
%corresponds to the classifier for label i
[all_theta] = ONEVSALL(X, y, num_labels, lambda) trains num_labels
logisitc regression classifiers and returns each of these classifiers
in a matrix all_theta, where the i-th row of all_theta corresponds
to the classifier for label i
% Some useful variables
m = size(X, 1);% num of samples
n = size(X, 2);% num of features
% You need to return the following variables correctly
all_theta = zeros(num_labels, n + 1);
% Add ones to the X data matrix
X = [ones(m, 1) X];
% ====================== YOUR CODE HERE ======================
% Instructions: You should complete the following code to train num_labels
logistic regression classifiers with regularization
parameter lambda.
% Hint: theta(:) will return a column vector.
% Hint: You can use y == c to obtain a vector of 1's and 0's that tell use
whether the ground truth is true/false for this class.
% Note: For this assignment, we recommend using fmincg to optimize the cost
function. It is okay to use a for-loop (for c = 1:num_labels) to
loop over the different classes.
fmincg works similarly to fminunc, but is more efficient when we
are dealing with large number of parameters.
% Example Code for fmincg:
% Set Initial theta
initial_theta = zeros(n + 1, 1);
% Set options for fminunc
options = optimset('GradObj', 'on', 'MaxIter', 50);
% Run fmincg to obtain the optimal theta
% This function will return theta and the cost
[theta] = ...
fmincg (@(t)(lrCostFunction(t, X, (y == c), lambda)), ...
initial_theta, options);
initial_theta = zeros(n + 1, 1);
options = optimset('GradObj','on','MaxIter',50);
for c = 1:num_labels %num_labels 为逻辑回归训练器的个数,num of logistic regression classifiers
all_theta(c, :) = fmincg(@(t)(lrCostFunction(t, X, (y == c),lambda)), initial_theta,options );
% =========================================================================
lrCostFunction,完全可参考:http://www.cnblogs.com/hapjin/p/6078530.html 里面的 正则化的逻辑回归模型实现costFunctionReg.m文件
下面来解释一下 for循环:
num_labels 为分类器个数,共10个,每个分类器(模型)用来识别10个数字中的某一个。
我们一共有5000个样本,每个样本有400中特征变量,因此:模型参数θ 向量有401个元素。
initial_theta = zeros(n + 1, 1); % 模型参数θ的初始值(n == 400)
all_theta是一个10*401的矩阵,每一行存储着一个分类器(模型)的模型参数θ 向量,执行上面for循环,就调用fmincg库函数 求出了 所有模型的参数θ 向量了。
求出了每个模型的参数向量θ,就可以用 训练好的模型来识别数字了。对于一个给定的数字输入(400个 feature variables) input instance,每个模型的假设函数hθ(i)(x) 输出一个值(i = 1,2,...10)。取这10个值中最大值那个值,作为最终的识别结果。比如g(hθ(8)(x))==0.96 比其它所有的 g(hθ(i)(x)) (i = 1,2,...10,但 i 不等于8) 都大,则识别的结果为 数字 8
function p = predictOneVsAll(all_theta, X)
%PREDICT Predict the label for a trained one-vs-all classifier. The labels
%are in the range 1..K, where K = size(all_theta, 1).
p = PREDICTONEVSALL(all_theta, X) will return a vector of predictions
for each example in the matrix X. Note that X contains the examples in
rows. all_theta is a matrix where the i-th row is a trained logistic
regression theta vector for the i-th class. You should set p to a vector
of values from 1..K (e.g., p = [1; 3; 1; 2] predicts classes 1, 3, 1, 2
for 4 examples)
m = size(X, 1);
num_labels = size(all_theta, 1);
% You need to return the following variables correctly
p = zeros(size(X, 1), 1);
% Add ones to the X data matrix
X = [ones(m, 1) X];
% ====================== YOUR CODE HERE ======================
% Instructions: Complete the following code to make predictions using
your learned logistic regression parameters (one-vs-all).
You should set p to a vector of
(from 1 to
num_labels).
% Hint: This code can be done all vectorized using the max function.
In particular, the max function can also return the index of the
max element, for more information see 'help max'. If your examples
are in rows, then, you can use max(A, [], 2) to obtain the max
for each row.
[~,p] = max( X * all_theta',[],2); % 求矩阵(X*all_theta')每行的最大值,p 记录矩阵每行的最大值的索引
% =========================================================================
阅读(...) 评论()让更多人了解“机器学习”
机器学习方法(五):逻辑回归Logistic Regression,Softmax Regression
欢迎转载,转载请注明:本文出自Bin的专栏。
技术交流QQ群:,欢迎对算法、技术、应用感兴趣的同学加入。
前面介绍过的基本知识,线性回归因为它的简单,易用,且可以求出闭合解,被广泛地运用在各种机器学习应用中。事实上,除了单独使用,线性回归也是很多其他算法的组成部分。线性回归的缺点也是很明显的,因为线性回归是输入到输出的线性变换,拟合能力有限;另外,线性回归的目标值可以是(-∞,+∞),而有的时候,目标值的范围是[0,1](可以表示概率值),那么就不方便了。
逻辑回归可以说是最为常用的机器学习算法之一,最经典的场景就是计算广告中用于CTR预估,是很多广告系统的核心算法。
逻辑回归Logistic Regression
逻辑回归(LR),虽然叫回归,然是从目标函数来看,它是设计用来做分类的,经典的LR是用于二分类的情况的,也就是说只有0,1两类。
定义一个样本xi∈Rm的类别是1的概率为:
P(yi=1|xi)=exp(wTxi)1+exp(wTxi)=11+exp(-wTxi)
这就是sigmoid函数的形式,绘制出来是这样的形式:
可以看到,取值范围是在(0,1)的,因此近似可以理解为一个概率的取值。在神经网络模型中,sigmoid函数是一种激励函数,其他常见的还有tanh函数,以及其他一些函数。(这些激励函数后面介绍神经网络模型的时候再展开)
记sigmoid函数为
h(xi)=P(yi=1|xi)=11+exp(-wTxi)
给定一个数据集S,其中有N个样本,那么可以写出目标函数:最小化负对数似然函数:
minwL(w)=-log∏i=1Nh(xi)yi(1-h(xi))1-yi=-∑i=1N[yilogh(xi)+(1-yi)log(1-h(xi))]=-∑i=1N[yi(wTxi)-log(1+exp(wTxi))]
可以看到目标函数本质上是一个求和的形式,为了防止数值本身过大,一般会用平均值形式:
L(w)=-1N∑i=1N[yi(wTxi)-log(1+exp(wTxi))]
如何优化这个目标函数呢?采用标准的梯度下降算法,梯度下降可以参考我前面写的中关于梯度下降的部分,也可以参考一下资料[2]。
?L(w)=?L?w=1N∑i=1N(h(xi)-yi)xiw=w-α??L(w)
通过梯度下降,我们就可以求出w,然后带到
P(yi=1|xi)=11+exp(-wTxi)
就可以求出属于1类的概率,只要概率大于0.5,我们就可以分类为1;当然,如果保留概率本身的数值,我们也可以认为是做了一个回归预测,只不过取值范围是(0,1)。
Softmax Regression
上面介绍的逻辑回归是针对二分类问题的,可以看下图图2,实线部分就是表示逻辑回归的model,多个输入,一个输出,
如果有多类,我们可以采用多个二分类,且互相间是独立的;另外一种情况,类别之间不是独立的,而是同时在多个类中进行分类,这个时候就需要用softmax了(图2中,虚线部分又增加了一个输出,实际上逻辑回归是softmax的一个特例)。
当有k个类别时,一个样本x(i)属于第j类的概率是:
p(y(i)=j|x(i);w)=ewTjx(i)∑kl=1ewTlx(i)
(如果j=0,1,而且w0=0,那么就是逻辑回归的形式了,只不过因为只有两类,逻辑回归就只关注类1,而不关注类0了)
模仿逻辑回归,我们可以写出似然函数:
∏i=1N∏j=1k(ewTjx(i)∑kl=1ewTlx(i))1{y(i)=1}
类似的,目标函数是
minwJ(w)=-1N∑i=1N∑j=1k[1{y(i)=1}logewTjx(i)∑kl=1ewTlx(i)]
于是,可以求出目标函数对于参数的梯度,对于每一个输出目标j,其参数wj的梯度是,
?wjL(w)=?J(w)?wj=-1N∑i=1Nxi(1{y(i)=j}-p(y(i)=j|x(i);w))
对于每一个wj,j=1,2,…,k,采用更新:
wj=wj-α??wjL(w)
基本的算法到这里就可以结束了,不过如果我们再看一下下面的性质,
p(y(i)=j|x(i);w)=ewTjx(i)∑kl=1ewTlx(i)=e(wj+c)Tx(i)∑kl=1e(wl+c)Tx(i)
其中c是一个常数向量。也就是说,如果学到的最优解wj经过任意平移变换以后,目标函数值不变,依然是最优解。避免数值太大,可以加入一项weight decay项(也就是正则项,可以参考前面的),即目标函数是:
minwJ(w)=-1N∑i=1N∑j=1k[1{y(i)=1}logewTjx(i)∑kl=1ewTlx(i)]+λ2∑j=1k∑v=1mw2jv
对应的,梯度是:
?wjL(w)=?J(w)?wj=-1N∑i=1Nxi(1{y(i)=j}-p(y(i)=j|x(i);w))+λwj
(上面的weight decay方法也可以直接用于逻辑回归,形式几乎是一样的。)
对于每一个样本、每一个类别,softmax都可以求出一个概率p(y(i)=j|x(i);w),然后概率最大的那个类别就是分类的类别。如何决定是用一个softmax Regression,还是用k个logistic Regression?一般来说可以根据类别是否mutually exclusive来决定——如果互相间有重合(或者本身在语义上并不相关,比如一张图片“是否风景照片”和“是否含有人”),那么就用k个logistic Regression;如果互相间是互斥的,那么就可以采用softmax。
前面主要讲了梯度下降来求解,实际上有非常多的优化方法可以比梯度下降做到更快更好,常见的有BFGS method,SGD,Conjugate gradient method等,具体这些方法在本文就不展开了,后面有时间分别介绍一下。
Ok,逻辑回归和softmax就介绍到这里。这两个算法也是深度学习中经常会被提到的基础算法,后面在介绍深度学习的时候,可以再回来复习下。接下来打算写一些深度学习相关的最最基础的算法。
觉得有一点点价值,就支持一下哈!花了很多时间手打公式的说~更多内容请关注
[3] PRML, ch4 , Logistic regresssion
机器学习(二)广义线性模型:逻辑回归与Softmax分类
softmax分类算法原理(用python实现)
机器学习笔记04:逻辑回归(Logistic regression)、分类(Classification)
【机器学习】Logistic Regression 的前世今生(理论篇)
DNN:逻辑回归与 SoftMax 回归方法
逻辑回归(Logistic Regression)
没有更多推荐了,网站已改版,请使用新地址访问:
ex3 机器学习关于逻辑回归的应用以及附有matlab源代码
238万源代码下载- www.pudn.com
&文件名称: ex3
& & & & &&]
&&所属分类:
&&开发工具: matlab
&&文件大小: 7720 KB
&&上传时间:
&&下载次数: 26
&&提 供 者:
&详细说明:机器学习关于逻辑回归的应用以及附有matlab源代码-Machine learning logistic regression with Matlab source code
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&ex3&&...\ex3.pdf&&...\mlclass-ex3&&...\...........\displayData.m&&...\...........\ex3.m&&...\...........\ex3_nn.m&&...\...........\ex3data1.mat&&...\...........\ex3weights.mat&&...\...........\fmincg.m&&...\...........\lrCostFunction.m&&...\...........\oneVsAll.m&&...\...........\predict.m&&...\...........\predictOneVsAll.m&&...\...........\sigmoid.m&&...\...........\submit.m&&...\...........\submitWeb.m
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 机器学习中的关于逻辑回归(LR)方法的分类器,matlab源码,附带四个数据集用于实验
&[] - minFunc工具包,里边包含了逻辑回归及svm的代码,可以直接应用
&[] - 关于Logistic回归统计算法的matlab实现,内容包括建模、输出变量预测和预测误差分析。数据来自UCI数据库中的Ionosphere database,有351个统计实例,输出变量是二分类变量,代表电波从电离层反射的好坏情况,共有32个特征值。(压缩包中包含已经处理好的数据)
&[] - 关于逻辑回归的教案,讲述了其原理及应用(主要是流行病学)。
&[] - 二分类问题采用包括逻辑回归、最小二乘法、感知器算法(按下space不断迭代)、svm线性分类,另外还有高斯分线性分类(待完善),针对平面上两类点进行分类
&[] - matlab写的fisher 分类器,很简单适合初学者,体验机器学习的过程
&[] - matlab实现的推荐系统,融合机器学习的方法,出自斯坦福大学吴恩达
&[] - 基于逻辑回归的分类实验,在UCI数据库的audlt数据集上进行测试
&[] - machine learning algorithm
&[] - andrew NG上的课程machine learning 的习题解答,这些习题对于机器学习入门还是非常有帮助的,值得学习。机器学习算法:逻辑回归原理介绍
一、逻辑回归基本概念
1. 什么是逻辑回归
逻辑回归就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏。
Logistic回归虽然名字里带&回归&,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别)
回归模型中,y是一个定性变量,比如y=0或1,logistic方法主要应用于研究某些事件发生的概率
2. 逻辑回归的优缺点
1)速度快,适合二分类问题
2)简单易于理解,直接看到各个特征的权重
3)能容易地更新模型吸收新的数据
对数据和场景的适应能力有局限性,不如决策树算法适应性那么强
3. 逻辑回归和多重线性回归的区别
Logistic回归与多重线性回归实际上有很多相同之处,最大的区别就在于它们的因变量不同,其他的基本都差不多。正是因为如此,这两种回归可以归于同一个家族,即广义线性模型(generalizedlinear model)。
这一家族中的模型形式基本上都差不多,不同的就是因变量不同。这一家族中的模型形式基本上都差不多,不同的就是因变量不同。
如果是连续的,就是多重线性回归 如果是二项分布,就是Logistic回归 如果是Poisson分布,就是Poisson回归 如果是负二项分布,就是负二项回归
4. 逻辑回归用途
寻找危险因素:寻找某一疾病的危险因素等; 预测:根据模型,预测在不同的自变量情况下,发生某病或某种情况的概率有多大; 判别:实际上跟预测有些类似,也是根据模型,判断某人属于某病或属于某种情况的概率有多大,也就是看一下这个人有多大的可能性是属于某病。
5. Regression 常规步骤
寻找h函数(即预测函数) 构造J函数(损失函数) 想办法使得J函数最小并求得回归参数(&)
6. 构造预测函数h(x)
1) Logistic函数(或称为Sigmoid函数),函数形式为:
对于线性边界的情况,边界形式如下:
其中,训练数据为向量
构造预测函数为:
函数h(x)的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
P(y=1│x;&)=h_& (x)
P(y=0│x;&)=1-h_& (x)
7.构造损失函数J(m个样本,每个样本具有n个特征)
Cost函数和J函数如下,它们是基于最大似然估计推导得到的。
8. 损失函数详细推导过程
1) 求代价函数
概率综合起来写成:
取似然函数为:
对数似然函数为:
最大似然估计就是求使l(&)取最大值时的&,其实这里可以使用梯度上升法求解,求得的&就是要求的最佳参数。
在Andrew Ng的课程中将J(&)取为下式,即:
2) 梯度下降法求解最小值
&更新过程可以写成:
ectorization是使用矩阵计算来代替for循环,以简化计算过程,提高效率。
向量化过程:
约定训练数据的矩阵形式如下,x的每一行为一条训练样本,而每一列为不同的特称取值:
g(A)的参数A为一列向量,所以实现g函数时要支持列向量作为参数,并返回列向量。
&更新过程可以改为:
综上所述,Vectorization后&更新的步骤如下:
求 A=x*& 求 E=g(A)-y 求
(1) 过拟合问题
过拟合即是过分拟合了训练数据,使得模型的复杂度提高,繁华能力较差(对未知数据的预测能力)
下面左图即为欠拟合,中图为合适的拟合,右图为过拟合。
(2)过拟合主要原因
过拟合问题往往源自过多的特征
1)减少特征数量(减少特征会失去一些信息,即使特征选的很好)
? 可用人工选择要保留的特征;
? 模型选择算法;
2)正则化(特征较多时比较有效)
? 保留所有特征,但减少&的大小
(3)正则化方法
正则化是结构风险最小化策略的实现,是在经验风险上加一个正则化项或惩罚项。正则化项一般是模型复杂度的单调递增函数,模型越复杂,正则化项就越大。
正则项可以取不同的形式,在回归问题中取平方损失,就是参数的L2范数,也可以取L1范数。取平方损失时,模型的损失函数变为:
lambda是正则项系数:
? 如果它的值很大,说明对模型的复杂度惩罚大,对拟合数据的损失惩罚小,这样它就不会过分拟合数据,在训练数据上的偏差较大,在未知数据上的方差较小,但是可能出现欠拟合的现象;
? 如果它的值很小,说明比较注重对训练数据的拟合,在训练数据上的偏差会小,但是可能会导致过拟合。
正则化后的梯度下降算法&的更新变为:
部分内容参考自:
二、实现逻辑回归
from sklearn.linear_model import LogisticRegression
Model = LogisticRegression()
Model.fit(X_train, y_train)
Model.score(X_train,y_train)
# Equation coefficient and Intercept
Print(&Coefficient&,model.coef_)
Print(&Intercept&,model.intercept_)
# Predict Output
Predicted = Model.predict(x_test)}

我要回帖

更多关于 matlab 机器学习数据扩充 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信