分类问题
自己翻译了一些,对照了下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函数绘出图形如下:
决策边界(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的区域的线,由我们的假设函数创建的。
举例有:
代价函数(Cost Function)
由于许多局部优化,换句话说:它不会是一个凸函数。因此我们不能使用与线性回归相同的成本函数,因为逻辑函数会导致输出为波浪形。
这里定义逻辑递归的代价函数为:这里要重点理解:对于下面两个图的对比是理解cost的关键
简化后的代价函数与梯度下降
这里我们可以将上面的代价函数简化为一个式子:
\(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))\)
梯度下降依然用到多次迭代,其形式与线性回归中的相同:
高级优化手段
“共轭梯度”、“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”是我们其中一个类的成员的概率。