自己翻译了一些,对照了下google的翻译结果,发现有好多还不如机器翻译的...果然AI大法好 :)
开始新的章节--分类
为了尝试分类,直觉想到了使用线性回归,即将大于0.5的所有预测映射为1,全部小于0.5的映射为0.然而由于分类问题并不是简单的线性函数,因此该分类实际上并不能很好进行。其实分类问题与回归问题很相似,除了我们预测的y取值仅是一些较少的离散值。现在,我们将重点介绍二进制分类问题,其中y只能选取两个值0或1.比如我们试图建立一个垃圾邮件分类机制,那么输入的x(i)可能是一封邮件的很多特征,输出值可能是0或1,即是或否。因此y∈{0,1}。
0也称为负类(negative),1称为正类(positive)有时也用符号“ - ”和“+”表示。
假设函数的表述
我们可以忽略分类问题,忽略y是离散值的事实,并且使用我们的旧的线性回归算法尝试预测给定x的y。 然而,这种方法执行起来很差。更为直观地,当我们已知y∈{0,1}时,\(h_\theta(x)\)取大于1或小于0的值也没有意义。 为了解决这个问题,我们来改变我们的假设\(h_\theta(x)\)的形式,以满足0≤\(h_\theta(x)\)≤1。
首先通过将\(\theta^Tx\)插入逻辑功能来实现的,这里我们称为“S形功能函数”(sigmoid function),也称为”逻辑函数“(Logistic Function):\(h_\theta(x) = g(\theta^Tx)\),令\(z = \theta^Tx\),我们有:
\(g(z)=\frac{1}{1+e^{-z}}\)
利用绘图软件plot函数绘出图形如下:
![sigmoid function](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fgdv8rdwz6j20ks03dwen.jpg)
hθ(x)将给出我们的输出为1的概率。例如,hθ(x)= 0.7给出了我们的输出为1的70%的概率。(例如,如果为1的概率为70%,则为0的概率为30%)。
决策边界(decision boundary)
为了更好的离散化0,1分类,我们希望的假设函数输出为:
\(h_\theta(x)\geq 0.5->y=1\)
\(h_\theta(x)\leq 0.5->y=0\)
因此如果对我们的输入g是\(\theta^TX\),那么意味着:
\(h_\theta(x)=g(\theta^Tx\geq0.5)\)
当\(\theta^Tx\geq0\)
决策边界是分离y = 0和y = 1的区域的线,由我们的假设函数创建的。
举例有:
![boundary line](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fgdv8rotqfj208d04vwed.jpg)
在这种例子中,我们的决策边界是放置在 \(x_1\)= 5的图形上的直线垂直线,其左边的一切表示y = 1,而右边的所有内容表示y = 0。这里重申一下:g(z)中的输入并不是一定要求为线性,可以为: \(z=\theta_0+\theta_1x_1^2+\theta_2x_2^2\)。
代价函数(Cost Function)
由于许多局部优化,换句话说:它不会是一个凸函数。因此我们不能使用与线性回归相同的成本函数,因为逻辑函数会导致输出为波浪形。
这里定义逻辑递归的代价函数为:这里要重点理解:对于下面两个图的对比是理解cost的关键
![logistic regression-cost function](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fges1vbm2gj20bl036mx6.jpg)
当y=1时,我们绘出 \(J(\theta)\)和 \(h_\theta(x)\):
![J vs h(x)](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fges4cgsl7j208m06kq3h.jpg)
相似地,当y=0时,我们也能绘出如下 \(J(\theta)\)和 \(h_\theta(x)\):
![J vs h(x)](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fges1xipv5j208707wgm2.jpg)
总结如下:
![summary of the cost](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fges1w3pu6j20af02cgll.jpg)
如果我们的正确答案'y'为0,那么如果我们的假设函数也输出0,则成本函数将为0。如果我们的假设接近1,则成本函数将接近无穷大。如果我们的正确答案'y'为1,那么如果我们的假设函数输出1,则成本函数将为0。如果我们的假设接近0,则成本函数将接近无穷大。注意,以这种方式编写成本函数可以保证J(θ)对于逻辑回归是凸的。
简化后的代价函数与梯度下降
这里我们可以将上面的代价函数简化为一个式子:
\(Cost(h_\theta(x),y)=-ylog(h_\theta(x))-(1-y)log(1-h_\theta(x))\)
在这个式子中:当y=1时,第二个式子\((1-y)log(1-h_\theta(x))\)将为0从而不会影响结果。若y=0时,式子\(-ylog(h_\theta(x))\)将为0也不会影响结果。
完整地,我们有:
\(J(\theta)=-\frac{1}{m}\sum_{i=1}^{m}[y^{(i)}log(h_\theta(x^{(i)}))+(1-y^i)log(1-h_\theta(x^{(i)}))]\)
以向量的表示方法来说有:
\(h=g(X\theta)\)
\(J(\theta)=\frac{1}{m}(-y^Tlog(h)-(1-y)^Tlog(1-h))\)
梯度下降依然用到多次迭代,其形式与线性回归中的相同:
![repeat of grad](http://wx1.sinaimg.cn/mw690/7b8d2108gy1fges1whk85j206g031q2r.jpg)
利用微积分计算偏导数有:
![derivative of the grad](http://wx3.sinaimg.cn/mw690/7b8d2108gy1fges1x4c4jj209f037t8l.jpg)
向量快速计算中表示方法为:
![vector of grad](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fges1xakedj206g01a742.jpg)
高级优化手段
“共轭梯度”、“BFGS”和“L-BFGS”是相比梯度下降更为复杂,更快捷的方法来优化θ。 这里建议不要自己编写这些更复杂的算法,而是使用octave/Matlab中的库,因为它们已经经过测试和高度优化。
这些方法中我们首先应该定义代价函数\(J(\theta)\)和梯度\(\frac{\partial }{\partial j}J(\theta)\)
简单的代码形式如下
function [jVal, gradient] = costFunction(theta)
jVal = [...code to compute J(theta)...];
gradient = [...code to compute derivative of J(theta)...];
end
那么我们可以使用octave的“fminunc()”优化算法。通过以及“optimset()”函数来创建一个包含我们想要发送到“fminunc()”的选项的对象。
我们给出函数“fminunc()”的成本函数、theta值的初始向量和事先创建的“options”对象。
options = optimset('GradObj', 'on', 'MaxIter', 100);
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
多变量下的分类问题:one-vs-all
现在,当我们有两个以上的类别时,我们将接近数据分类。现在扩展我们的定义, 不再是y = {0,1}而是y = {0,1 ... n}。由于y = {0,1 ... n},我们将问题划分为n + 1(+1,因为索引从0开始)二进制分类问题; 在每个类中,我们预测“y”是我们其中一个类的成员的概率。
![one vs all](http://wx4.sinaimg.cn/mw690/7b8d2108gy1fget7er3owj207b04xq2y.jpg)
我们首先选择一个类,然后将所有其他类统一到一个类上。 我们反复这样做,对每种情况应用二元逻辑回归,然后使用返回最高值的假设作为我们的预测,举例如下图:
![one vs all](http://wx2.sinaimg.cn/mw690/7b8d2108gy1fget7fcny8j20d4075t9e.jpg)
总结一下:对每个类都训练一个逻辑回归分类器 \(h_\theta(x)\),以预测在y=i时的概率,最后挑选分类器 \(h_\theta(x)\)的最大值。