第 28节 - 逻辑回归之代价函数 (4)
参考视频: 6 - 4 - Cost Function (11 min).mkv
![79770b3d045f9c96d04187c72e15570c.png](https://i-blog.csdnimg.cn/blog_migrate/8b849440ac419735b353f542cbd1a2ed.jpeg)
在这段视频中,我们要介绍如何拟合逻辑回归模型的参数θ。具体来说,我要定义用来拟合参数的优化目标或者叫代价函数,这便是监督学习问题中的逻辑回归模型的拟合问题。
对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们
也可以对逻辑回归模型沿用这个定义,但是问题在于,当我们将
带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convex function)。
![c7d95fd7877c4cddec3cc5a49a085578.png](https://i-blog.csdnimg.cn/blog_migrate/ad510d3c93a078eeca5114ffe1dbb9fd.jpeg)
这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。
线性回归的代价函数为:
![f0188c04a56fcc41e86d4926986e64ae.png](https://i-blog.csdnimg.cn/blog_migrate/f5201f646bd4ca516fc3c4c5aed5312b.jpeg)
我们重新定义逻辑回归的代价函数为:
![9df16c71089ae4d21ae77743bc46193b.png](https://i-blog.csdnimg.cn/blog_migrate/e76d365f089a06060952d47bedb39e8e.jpeg)
其中
![7dd6f725eb6a18c4f0374cbeef56abb8.png](https://i-blog.csdnimg.cn/blog_migrate/b9cba4fc5a956d34e3433b1174dc6ed7.jpeg)
hθ(x)与 Cost(hθ(x),y)之间的关系如下图所示:
![c5e0d1c60c4d81c615feb0d753155686.png](https://i-blog.csdnimg.cn/blog_migrate/5fe7ad2e359aff84b63b946cdbbd1e0d.jpeg)
这样构建的 Cost(hθ(x),y)函数的特点是:当实际的 y=1 且 hθ 也为 1 时误差为 0,当 y=1但 hθ 不为 1 时误差随着 hθ 的变小而变大;当实际的 y=0 且 hθ 也为 0 时代价为 0,当 y=0 但 hθ 不为 0 时误差随着 hθ 的变大而变大。
将构建的 Cost(hθ(x),y)简化如下:
![450a4b7201ffea644a1092bcb4dc85f0.png](https://i-blog.csdnimg.cn/blog_migrate/a80eb66e690de8b5b327d2681b6361ca.jpeg)
带入代价函数得到:
![83e89fcf59c0876628be503d7d2d6152.png](https://i-blog.csdnimg.cn/blog_migrate/2104e4d7745cd0caed26106ab6bd17b1.jpeg)
即:
![5ef25c0404ad081104b39188d237326b.png](https://i-blog.csdnimg.cn/blog_migrate/dad96fc96daacc79324df983f1612a3b.jpeg)
Python 代码实现:
import numpy as np def cost(theta, X, y): theta = np.matrix(theta) X = np.matrix(X) y = np.matrix(y) first = np.multiply(-y, np.log(sigmoid(X* theta.T))) second = np.multiply((1 - y), np.log(1 - sigmoid(X* theta.T))) return np.sum(first - second) / (len(X))
在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:
![209304f1d12a4fcbd8559dc0e238a2ff.png](https://i-blog.csdnimg.cn/blog_migrate/144f54dfb278c4871c704713f9410625.jpeg)
求导后得到:
![ecd903bf8c1e917d0f09a62229ac4343.png](https://i-blog.csdnimg.cn/blog_migrate/b5dabb1ab2ebd5ad3e036a2da1ea1d65.jpeg)
在这个视频中,我们定义了单训练样本的代价函数,凸性分析的内容是超出这门课的范围的,但是可以证明我们所选的代价值函数会给我们一个凸优化问题。代价函数 J(θ)会是一个凸函数,并且没有局部最优值。推导过程:
![ac3bc17c51708d468fe9700b9a5d64ca.png](https://i-blog.csdnimg.cn/blog_migrate/831b1f052f6960dd97d9ae634b042440.jpeg)
注:虽然得到的梯度下降算法表面上看上去与线性回归的梯度下降算法一样,但是这里的 hθ(x)=g(θTX)与线性回归中不同,所以实际上是不一样的。另外,在运行梯度下降算法之前,进行特征缩放依旧是非常必要的。
一些梯度下降算法之外的选择: 除了梯度下降算法以外,还有一些常被用来令代价函数最小的算法,这些算法更加复杂和优越,而且通常不需要人工选择学习率,通常比梯度下降算法要更加快速。这些算法有:共轭梯度(Conjugate Gradient),局部优化法(Broyden fletcher goldfarb shann,BFGS)和有限内存局部优化法(LBFGS) fminunc 是 matlab 和 octave 中都带的一个最小值优化函数,使用时我们需要提供代价函数和每个参数的求导,下面是 octave 中使用 fminunc 函数的代码示例:
function [jVal, gradient] = costFunction(theta) jVal = [...code to compute J(theta)...]; gradient = [...code to compute derivative of J(theta)...]; end options = optimset('GradObj', 'on', 'MaxIter', '100'); initialTheta = zeros(2,1); [optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
在下一个课程中,我们会把单训练样本的代价函数的这些理念进一步发展,然后给出整个训练集的代价函数的定义,我们还会找到一种比我们目前用的更简单的写法,基于这些推导出的结果,我们将应用梯度下降法得到我们的逻辑回归算法。