说在前面:
- 从本次笔记开始,我们开始讨论机器学习的另一个问题,分类问题,分类问题的输出结果是离散的,一般是0/1,有时也有其他的离散值。比如说我们在第一篇笔记中提到的垃圾邮件问题:如何判断一封邮件是有用的邮件还是垃圾邮件;还有判断肿瘤是良性还是恶性的问题等等,这些可以说都是分类问题。下面我们就开始讨论这个问题。
1.分类(classification)
问题描述:假设有一个肿瘤的良性恶性数据集如下,1代表良性,0代表恶性,横坐标为Tumor Size(肿瘤大小)预测肿瘤大小肿瘤的情况。
假设我们采用之前的线性回归的方法来分析这个问题,看下效果如何,我们肯定需要根据数据集拟合回归直线,那么我们拟合出来的结果大概应该如下:
我们的假设函数还是h(x),通过拟合的直线,我们可以设定当h(x)>0.5时,认为肿瘤是恶性的,当h(x)<0.5时,认为肿瘤是良性的,看横坐标,当肿瘤大小大于图上的中点时,认为是恶性的,反之;这样来看似乎用线性回归的方法可以解决分类问题,至少这样来分的话可以分类,但是不要太早下结论,下面在右边加一个点,我们再来拟合直线,我们再讨论一下:
- 这时候我们只增加了一个数据(右边的一个点),我们再拟合出来的直线就是蓝色的线,这时我们再用横坐标大于蓝色的中间的点来说明是恶性的就出现问题了,发现蓝色点左边也有点是恶性的,并不是良性的,这就说明前面的那种情况是运气较好,线性回归还是解决不了分类问题的;另一方面我们已经知道y的取值范围是[0,1],但是使用线性回归h(x),他的取值可以是大于1或者是小于0,可以是非常大,所以种种迹象表明线性回归解决分类问题是不合适的。所以下面我们会引入另一种方法解决分类问题。
2.假设陈述
我们前面讲到要想0<=h(x)<=1,那么我们将h(x)稍微修改一下,使他的范围在[0,1]:
g(z)称为Sigmoid函数也叫Logistic函数,他的图像如下所示,范围是[0,1],z趋近于正无穷时,g(z)趋近于1,z趋近于负无穷时,g(z)趋近于0.
模型解释
这里的h(x)代表我输入的x,对应的y=1的概率大小,用数学的概率论写出来就是
学过概率论的应该知道,这是一个条件概率,在x = θ的条件下发生y = 1的概率,那么由以下的公式我们还可以求得在x = θ的条件下y = 0的概率
3.决策界限(decision boundary)
预测y值结果
上面我们已经定义了新的h(x),那么我们如何给定一个θ,利用h(x)预测y值呢,当h(x)>=0.5时,我们可以认为y=1,反之当h(x)<0.5时,y=0;下面通过g(z)的图像进一步寻找y=1的条件:
下面我们来看一个例子更好得理解上面的结论:
这是一个数据集画出来的图像,我们还没有讲如何根据数据集来获得参数θ,后面我们会讨论如何寻找θ,在这里我们假设已经知道假设函数为
根据上面的预测y=1的条件,要使y=1就需要满足-3+x1+x2>=0,即x1+x2>=3;这里我们如果学过高中的线性规划,我们很快就发现他所表示的是一个区域,先把x1+x2=3这条直线画出来,在他上方的区域就是y=1的区域,在他下方的区域就是y=0的区域:
下面我们再来看一个较复杂的例子:
前面我们已经知道了可以用多项式来拟合曲线,这样得到的线就不一定是直线了,和上面一样假设我们已经知道了h(x)以及参数0:
相类似的画出图像分区如下,可以发现这个分界线就不是直线而是一个圆,如果拟合的多项式更复杂,那分界线可能就是不规则的曲线:
4.代价函数
上面我们已经知道了h(x)的含义以及如何预测y的值,那么我们下面就来讨论如何找出参数矩阵0,找参数我们就不得不想到前面我们讨论线性回归时的代价函数,他是我们评价0是否合理的一个评判标准,前面的代价函数为:
这个代价函数对于线性回归问题非常好,但是对于逻辑回归,由于h(x)不是线性的,画出的J(0)的图像就会出现如下状态,再使用梯度下降的时候就会出现很多局部最优解,导致求出的0不是最低点,不能很好的拟合0.
这是一个非凸函数,我们想要找的代价函数是一个凸函数,在利用梯度下降时可以找到全局最优解:
我们为了使代价函数为凸函数,我们新定义Cost(h(x),y):
采用对数定义的好处通过对数的图像就可以发现,当y=1时,Cost(h(x),y)的图像如下图所示,当h(x)=1时,Cost(h(x),y)=0,说明预测值与真实值相同,代价为0,而当h(x)趋近于0时,Cost(h(x),y)趋近于无穷,预测值与真实值相反,代价为无穷.这刚好符合我们的预测结果.
当y=0时,我们会得到如图所示,当h(x)=0时,Cost(h(x),y)=0,预测值与真实值相同,代价为0,当h(x)趋近于1时,Cost(h(x),y)趋近于无穷,预测值与真实值相反,代价为无穷。
- 新定义的代价函数可以有效的描述我们的逻辑回归,并且得到的代价函数为凸函数,后面可以使用梯度下降进行更新0的值。
5.简化代价函数与梯度下降
前面我们已经得到了Logistic回归的代价函数,由于他有两个条件判断,所以在计算代价的时候会不方便,下面我们就把Cost(h(x),y)函数进行化简,整合成一个式子:
可以简单的验证一下,把y=0和y=1分别带入式子,就发现和上面的式子是等价的,这样化简的好处是求代价的时候不用分开讨论,并且在后面梯度下降的时候一个式子也比较方便。
下面我们把Cost(h(x),y)函数带入到J(θ)里面得到最终的代价函数:
得到了代价函数,下面我们和之前线性回归一样目的是要求min(J(θ)),那么我们马上就要想到用梯度下降法,结合梯度下降的初始条件,我们可以求导推出Logistic回归的梯度下降更新表达式:
这里推导出来的梯度下降θ的更新表达式,可以和前面的线性回归的表达式做对比发现形式是一摸一样的,但实际上两个不是一个模型,因为这里的h(x)不是线性的,而是:
所以两个模型虽然表达式一样,但实际计算的时候还是有很大差别的。这里再次提醒一下,θ值是同时更新的!!!
- 到这里我们就把Logistic回归的梯度下降算法给讲完了,我们前面所讲的使其快速下降的特征缩放方法到Logistic回归依然可以用,同样可以使梯度下降速度加快。
6.高级优化
实际上我们寻找J(θ)的最小值的时候不止用梯度下降算法,还有许多算法可以寻找J(θ)的最小值,比如说:Conjugate gradient、BFGS、L-BFGS等算法,这些算法会比梯度下降更快得找到最优解,他们不需要控制a,他们会自己在某些时刻改变a的值,从而更快得找到最优解,这些算法可以用于许多数据集的情况,效果往往比梯度下降算法好得多,但是理解他们需要很长时间,他们的算法比较复杂,这里不在陈述具体算法,我们只讨论一下如何调matlab中的库来用这些算法到Logistic回归中:
下面给出一个简单的例子:
我们要用到库函数 fminunc(),我们要先定义一个function:
1
2
3
4
5function [jVal,gradient] = costFunction(thete)
jVal = (theta(1)-5)^2 + (theta(2)-5)^2;
gradient = zeros(2,1);
gradient(1) = 2*(theta(1)-5);
gradient(2) = 2*(theta(2)-5);之后调用的时候如下调用:
1
2
3options = optimset('GradObj','on','MaxIter','100');%设置下降为ON,最大迭代次数为100
initialTheta = zeros(2,1); %初始化theta向量
[optTheta,functionVal,exitFlag] = fminunc(@costFunction,initialTheta,options);%'@'表示对象的指针这就是使用库函数调用高级优化的方法,它不需要我们自己设置a(学习速率),他会自己在迭代的过程中改变a的值。
如果有多个θ的情况,我们只需要改变costFunction(theta)就可以,整体的模板如下:
1
2
3
4
5
6function [jVal,gradient] = costFunction(theta)
jVal = [code to compute J(θ)];
gradient(1) = [code to compute J(θ0)'];
gradient(2) = [code to compute J(θ1)'];
···
gradient(n+1) = [code to compute J(θn)'];
7.多元分类:一对多
生活中我们经常碰到一对多的问题,而不是简单的二元分类问题,比如说邮件分类问题,收到一封邮件,可以有很多分类:家人、同事、广告等,需要判断一封邮件到底属于哪个分类;再比如说现在比较重视的垃圾分类:可回收垃圾、不可回收垃圾、塑料垃圾、电池等分类,这都是一对多的问题。
下面我们把这些问题抽象出来,给出一个例子来讨论如何解决多分类问题:
现在我们有三个分类,三角形、红叉、正方形,现在要给定x1、x2预测到底属于哪一类,多元分类的离散值可以取y=1、y=2、y=3,对于这种问题,我们还是把他看成多个二元分类问题来解决,先单独看三角形,把另外两个看成一类,这就成了前面的二元分类问题,求出h(x),再单独看正方形,求出h(x),再单独看红叉,这样做三次二元回归问题,就把每一类所发生的概率h(x)给求出来了。
- 那么最后求出三个h(x),再给定x1,x2进行预测的时候就算一下三个h(x),求出哪一个最大那么就分为哪一类,即求出max(h(x)),这样就成功得解决了多元分类问题。