[ML skill]机器学习(machine learning)之逻辑回归
刚刚上篇多元线性回归的文章写了大半天 - - 发表了之后不知道为啥只有最初保存在草稿箱里的几个字 - - 不会出bug了吧
同学们大噶好!
今天跟大家介绍一下逻辑回归问题,前面文章好像提了一嘴。
所谓逻辑回归问题就是,生活中我们常常遇到一些问题并非呈现一种线性化的分布,比如说生一个小孩是男孩还是女孩,我在抽一张扑克是黑桃红桃方片梅花,这一类问题就是分类问题。可能有一些数值分析基础的同学们对于前面的线性回归问题并不难理解,毕竟只是一些不太复杂的数学计算,可是如何完成对一件事情通过一些features进行分类,反正对于我来说,在接触机器学习课程之前是怎么也想不清楚。
听我往下讲之前建议阅读:https://zhuanlan.zhihu.com/p/28775274
对于二元逻辑回归问题,本质上是对一些其他数学模型(如线性回归模型)的一些处理,使之对数据的敏感性更有利于对预测值h(x)的分类。
吴恩达老师在介绍这部分内容时采用了一种非常感性的方法,就是所谓的“你也不用管它是咋来的,你只要记住这个结果就行了 - -”,我在想讲述这里的时候也做了大概一天的尝试 = = 确实对我这种工科出身的糙汉子来说,无论是从计算机逻辑的角度还是从数学逻辑的角度都比较难以清楚地阐释 - - 所以我决定给大家复制一段知乎大神的发言,我对比了几份资料,感觉这个是最通俗易懂的,原文略有删减:
把 在 时的条件期望简记作:
如果引入一个函数 ,令:
称作链接函数 。如果 是恒等函数 ,则 [2.2] 就退化为 [1.4] (一般线性回归)。所以线性模型是 [2.2] 在链接函数为恒等函数时的特例。[2.2] 就是广义线性模型。链接函数 采用不同的形式就产生不同的模型。
考虑二分类问题。样本输出 是类别的标记:0 表示负例;1 表示正例。把 时样本属于正例的概率记为 ,则有:
最后的 是 的简写。令链接函数 是 函数:
函数图形为:
图 2.1 logit 函数图形
把 函数和 [2.3] 代入 [2.2] 中有:
也就是将正例与负例概率之比的对数(称作 )建模为线性。从这里也可看出,不论最终将判断正例的概率阈值定在多少,模型判断正例与负例的分界线是 ,为一条直线。现在将 [2.5] 变形得到:
对于二分类问题,一个可采用的损失函数是 。如果 取 1 和 0 标记正负例。令 时样本为正例的概率是 ,该损失函数为:
它是“对数似然”的相反数(可参考:https://zhuanlan.zhihu.com/p/28775274,中间解释得比较详细)。将 [2.8] 取相反就是对数似然。可以到看当 时对数似然为 ;当 时对数似然为 。 也是交叉熵 。交叉熵衡量两个分布的相似程度。其中一个分布是模型的预测分布。另一个分布是观察到的该样本类别的分布。对数似然越大越好。最小化 就是最大化对数似然,最小化交叉熵。
逻辑归回就是寻找 在训练集上最小化平均损失:
当找到了 ,一个新的样本 属于正例的概率就是:
可以根据 是否大于 0.5 (或者其他阈值)判断 是否属于正例。从这个式子也可以看出逻辑回归模型相当于只有一个神经元的神经网络,该神经元**函数是 。 不是凸函数,其最小值没有解析解,需要通过最优化算法来寻找 ,比如梯度下降法。
不知道大家看懂了没有,其实整个损失函数的推导(1,0分类的,也有1,-1分类的方法上文链接中也有简单提到)并不需要明确数学的推导只要会用就可以了,只要我们有明确的认识:损失函数是度量预测值和真实值差距的一种方法:
上面的引用也提及到,用这种方法得到的损失函数并非凸函数(convex),需要通过优化的算法得到。如果使用梯度下降算法求得J的最小值仍然需要前一篇线性回归中提到的过程:
而J对各个θ的偏导数也可以通过数学推导的方法实现:
看起来很像线性回归函数的更新规则有木有,不同的地方是他们假设函数有所变化。用代码实现以上功能为:
y_pred = sigmoid(X*theta);
J = 1/m* (-y'*log(sigmoid(X*theta)) - (1 - y')*log(1-sigmoid(X*theta)));
grad = 1/m* X'*(y_pred - y);
需要注意的是其中利用了一些向量化的方法,避免的循环for - loof的使用。
当然,除了梯度下降算法,吴老师还介绍了一些可供我们业余学习的其他算法,如Conjugate gradient(共轭梯度法)、BFGS(拟牛顿算法)、L-BFGS(L-拟牛顿算法),他们的优点是不用选择学习率,同时更加高效快捷,但缺点是比较复杂。
构造完成损失函数和它关于θ的偏导数后,按理来说我们应该选择学习率和迭代次数然后写梯度下降的算法了,但实际上matlab中为我们提供了非常优秀的自动计算极小值的算法,如fmincg
fminunc
Find minimum of unconstrained multivariable functionNonlinear programming solver.Finds the minimum of a problem specified by min f(x)
where f(x) is a function that returns a scalar.
x is a vector or a matrix; see Matrix Arguments.