吴恩达机器学习(四)——逻辑回归(Logistic Regression)

1、分类问题(Classification)

线性回归主要是解决监督学习问题中的“回归”问题,逻辑回归主要主要解决监督学习中的“分类”问题。

  • 在分类问题中,要预测的变量 ? 是离散的值。
  • 逻辑回归算法是分类算法。
  • 先从最简单的二分类问题开始讨论:
    分类问题的例子有:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;区别一个肿瘤是恶性的还是良性的。在这里插入图片描述
    1)因变量 y (dependent variable)可能属于的两个类,分别称为负向类(negative class)
    和正向类(positive class),可以用0和1来表示。在这里插入图片描述2)如图,若用线性回归来解决分类问题,以y=0.5为阈值,拟合的品红色直线在y=0.5点对应变量x(肿瘤大小)刚好区分开恶性与良性肿瘤。然而,若增加右上角一个孤立点,拟合直线由品红色过渡到蓝色直线,阈值对应的x向右移动,y=1的四个并列样本中有两个会估计错误。
    在这里插入图片描述
    3)使用线性回归,假设函数的输出值可能远大于 1,或者远小于 0,即使所有训练样本的标签 ? 都等于 0 或 1。
    4)逻辑回归算法的性质:输出值永远在 0 到 1 之间。

2、假说表示 (Hypothesis Representation)

  • 引入一个新的模型,逻辑回归,该模型的输出变量范围始终在 0 和 1 之间。
  • 逻辑回归模型的假设是:(多变量线性回归:ℎ?(?) = ?TX)
    在这里插入图片描述
  • ?(?)的作用是:对于给定的输入变量,根据选择的参数计算输出变量为1 的可能性(estimated probablity),即 ℎ?(?) = ?(? = 1|?;?) 。
    在这里插入图片描述
  • Logistic函数也称为Sigmoid (S 形)函数。

3、决策边界(decision boundary)

  • 概念梳理:
    在这里插入图片描述
    1)在逻辑回归中,当ℎ?(?) >= 0.5时,预测 ? = 1;当ℎ?(?) < 0.5时,预测 ? = 0。
    2)由上图 S 形函数图像可知,当 ? = 0 时 ,?(?) = 0.5;? > 0 时, ?(?) > 0.5;? < 0 时,?(?) < 0.5 。
    3)由于? = ???,因此:??? >= 0 时,预测 ? = 1;??? < 0 时,预测? = 0。
  • 举例说明:在这里插入图片描述假设参数? 是向量[-3 1 1],则当−3 + ?1 + ?2 ≥ 0,即?1 + ?2 ≥ 3时,模型将预测 ? =1;当−3 + ?1 + ?2 < 0,即?1 + ?2 < 3时,模型将预测 ? = 0。 故直线?1 + ?2 = 3便是模型的分界线,将正负样本的区域分隔开。
  • 决策边界是假设函数的一个属性,决定于其参数,不是数据集的属性。
  • 可以用非常复杂的模型来适应非常复杂形状的判定边界,举例说明:在这里插入图片描述
    1)需要用曲线才能分隔 ? = 0 的区域和 ? = 1 的区域。
    2)需要二次方特征:ℎ?(?) = ?(?0 + ?1?1 + ?2?2 + ?3?12 + ?4?22),参数? 是向量[-1 0 0 1 1],则我们得到的判定边界恰好是圆点在原点且半径为 1 的圆形。

4、代价函数(Cost Function)

本节主要介绍如何拟合逻辑回归模型的参数?,用来拟合参数的优化目标就是代价函数。

在这里插入图片描述

  • 当将ℎ?(?) 代入到定义了的代价函数中时,得到的代价函数将是一个非凸函数(non-convexfunction)。
    -这意味着代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。

在这里插入图片描述

  • 如何得到凸函数的代价函数?
    在这里插入图片描述
    2)ℎ?(?)与 ????(ℎ?(?),?)之间的关系如下图所示:在这里插入图片描述
    这样构建的????(ℎ?(?),?)函数的特点是:
    当实际的? = 1且ℎ?(?)也为1时,误差为0;当? = 1,但ℎ?(?)不为1时,误差随着ℎ?(?)变小而变大;
    当实际的? = 0且ℎ?(?)也为0时,代价为0;当? = 0, 但ℎ?(?)不为0时,误差随着ℎ?(?)的变大而变大。
    将线性函数转换为非线性函数。

5、简化的成本函数和梯度下降

(Simplified Cost Function and Gradient Descent)

本节主要是用一种简单的方法来写代价函数,同时弄清楚如何运用梯度下降法,拟合出逻辑回归的参数。

  • 将构建的 ????(ℎ?(?),?)简化如下:????(ℎ?(?),?) = −? × ???(ℎ?(?)) − (1 − ?) × ???(1 − ℎ?(?))
    带入代价函数得到:在这里插入图片描述
  • 要找尽量让?(?) 取得最小值时,参数?的取值。如果给出一个新的样本,假如某个特征 ?,可以用拟合训练样本的参数?,来输出对假设的预测。
  • 假设的输出,就是概率值:?(? = 1|?;?),关于 ?以?为参数,? = 1 的概率。
  • 最小化代价函数的方法是使用梯度下降法(gradient descent)。
    通常用的梯度下降法的模板及求导后的公式:(要求“同时”更新所有?的值。) 在这里插入图片描述
    推导过程:
    在这里插入图片描述
  • 虽然得到的梯度下降算法与线性回归的梯度下降算法看起来一样,但由于假设的定义发生了变化,逻辑函数的梯度下降,跟线性回归的梯度下降实际上是完全不同的。 定义如下:
    在这里插入图片描述
  • 在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。

6、高级优化(Advanced Optimization)

本节主要是一些高级优化算法和一些高级的优化概念,利用这些方法,能够使通过梯度下降,进行逻辑回归的速度大大提高,而这也将使算法更加适合解决大型的机器学习问题,比如,特征量数目庞大。
在这里插入图片描述

1)梯度下降法
  • 一种考虑梯度下降的思路:当输入参数 ? 时,它们会计算出两样东西:?(?) 以及 ? 等于 0、1 直到 ? 时的偏导数项。梯度下降所做的就是反复执行这些更新。
  • 另一种考虑梯度下降的思路是:我们需要写出代码来计算?(?) 和这些偏导数,然后把
    这些插入到梯度下降中,然后它就可以为我们最小化这个函数。
    (对于梯度下降,从技术上讲,实际并不需要编写代码来计算代价函数?(?)。只需要编写代码来计算导数项,但是,如果希望代码还要能够监控这些?(?) 的收敛性,那么就需要自己编写代码来计算代价函数?(?)和偏导数)
2)高级优化
  • 除了梯度下降算法以外,还有一些常被用来令代价函数最小的优化算法,这些算法更加高级和复杂,用来计算代价函数 ?(?)和偏导数项。
  • 如共轭梯度(Conjugate Gradient 变尺度法),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS 限制变尺度法),它们需要有一种方法来计算 ?(?),以及需要一种方法计算导数项,然后使用比梯度下降更复杂的算法来最小化代价函数。
    1)算法优点:不需要手动选择学习率 ?。 对于这些算法的一种思路是,给出计算导数项和代价函数的方法,可以认为算法有一个智能的内部循环,称为线性搜索(line search)算法,它可以自动尝试不同的学习速率 ?,并自动选择一个好的学习速率 ?,因此它甚至可以为每次迭代选择不同的学习速率。这些算法实际上在做更复杂的事情,而不仅仅是选择一个好的学习率,所以它们往往最终收敛得远远快于梯度下降
    2)算法主要缺点:比梯度下降法复杂多。
3)使用Octave实现高级算法
  • 假设有一个含两个参数?0和?1的问题,如果将?(?) 最小化的话,那么它的最小值将是?1 = 5, ?2 = 5。
    在这里插入图片描述
  • 如果不知道最小值,想要代价函数找到这个最小值,是用比如梯度下降这些算法,要运行一个像这样的 Octave 函数:
function [jVal, gradient]=costFunction(theta)       
	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); 
end

计算出这个代价函数,函数返回的第二个值是梯度值,梯度值应该是一个 2×1 的向量,梯度向量的两个元素对应这里的两个偏导数项。

  • 运行这个 costFunction 函数后,可以调用高级的优化函数,这个函数叫 fminunc,它表示 Octave 里无约束最小化函数。调用它的方式如下:
options=optimset('GradObj','on','MaxIter',100); 
initialTheta=zeros(2,1); 
[optTheta, functionVal, exitFlag]=fminunc(@costFunction, initialThet a, options); 

要设置几个 options,这个option变量作为一个数据结构可以存储想要的 options,所以 GradObj 和On,设置梯度目标参数为打开(on),这意味着要给这个算法提供一个梯度。 然后设置最大迭代次数,比方说 100。

给出一个? 的猜测初始值,是一个 2×1 的向量。

调用 fminunc,这个@符号表示指向我们刚刚定义的costFunction 函数的指针。它会使用众多高级优化算法中的一个,当然也可以把它当成梯度下降加强版,只不过它能自动选择学习速率?,找到最佳的?值。 (注意:这里的fminuc只适用于二维以上特征)

本节主要内容: 写一个函数,能返回代价函数值、梯度值,因此要把这个应用到逻辑回归,或者甚至线性回归中。也可以把这些优化算法用于线性回归,需要做的就是输入合适的代码来计算这些东西。 有了这些算法,可以使用一个复杂的优化库,让算法使用起来更模糊一点。因此也许稍微有点难调试,不过由于这些算法的运行速度通常远远超过梯度下降。

7、多类别分类:一对多

(Multiclass Classification_ One-vs-all)

本节主要讲如何使用逻辑回归来解决多类别分类问题。

多类别分类问题举例
需要一个学习算法能自动地将邮件分类在工作、朋友、家人、爱好等四个不同的文件夹中。其类别有四个,分别用? = 1、 ? = 2、 ? = 3、? = 4 来代表,这就是四元分类问题。
第二个例子是有关药物诊断的,如果一个病人因为鼻塞来到诊所,他可能并没有生病,用 ? = 1 这个类别表示;或者患了感冒,? = 2;得了流感? = 3,这是三元分类。
上述例子,?可以取一个很小的数值,比如 1 到 3、1 到 4 或者其它数值,以上说的都是多类分类问题,对于下标是 0 1 2 3,还是 1 2 3 4 都不重要,不会影响最后的结果。

二元和多元数据集分类的情况在这里插入图片描述
对二元的分类,可以用直线将数据集一分为二为正类和负类。对三元的分类,同样也可以用类似的原理进行操作,比如创建一个新的"伪"训练集,类型 2 和类型 3 定为负类,类型 1 设定为正类。
在这里插入图片描述
一对多的原理

  • 将多个类中的一个类标记为正向类(? = 1),然后将其他所有类都标记为负向类,这个模型记作ℎ?(1)(?)。
  • 接着,类似地选择另一个类标记为正向类(? = 2),再将其它类都标记为负向类,将这个模型记作ℎ?(2)(?),依此类推。
  • 最后得到一系列的模型简记为:ℎ? (?)(?) = ?(? = ?|?;?),其中:? = (1,2,3…?),然后选择一个让ℎ?(?)(?)最大的 ?。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值