(吴恩达机器学习)Logistic 回归
逻辑回归提出的原因:
对于分类问题,为什么不能用我们之前学习的线性回归算法来解决呢?有以下两点:
1:不能很好地说明实际情况的真正意义
2:函数值可能大于1或者小于0(对于二类分类0,1)
假设函数:
为了使函数值在0~1之间,假设函数h(x)从h(x) = θ’x换为 h(x) = g(θ’x)
其中g(z)=1/(1+e^-z)
h(x)的含义为:对于给定的输入x,y=1的概率为多少? 如下图所示:
由h(x)的含义可知,我们可以得到:
P(y=1|x;θ) = h(x)
P(y=0|x;θ) = 1-h(x)
代价函数:
对于线性回归问题,代价函数如下所示:
但是若对于逻辑回归问题(分类)同样使用上面的代价函数的话,将会发现J并不是一个凸函数(这里不进行说明),函数中间会存在很多的局部最优解,这对我们使用梯度下降算法来说不是很好。所以要改变逻辑回归问题的代价函数,如下:
对于为什么逻辑回归的代价函数是上图所示的原因,我先不进行解释,也许是上面的e^-z和下面的log(z)函数相对应了。这里我们先对上面的代价函数进行验证,看它是否能够满足我们问题的实际要求,即预测的好代价小,预测的差代价大。
(1):代价函数如图所示:
当y=1时
h(x)的值越接近1,代表结果为1的可能性越大,预测值和实际值相符,代价函数值也越趋于0。当h(x)越接近0时,代表预测的结果越差,所以代价函数值越大,满足要求。
(2):代价函数如图所示:
同理,也满足实际要求。
所以逻辑回归算法的整体代价函数如下分段函数:
将分段函数整合后,如下所示:
逻辑回归的梯度下降算法如下:
经过计算偏导数项,逻辑回归梯度下降具体计算过程如下:
你会惊讶的发现,现在逻辑回归的迭代计算过程和线性回归的一模一样!(可能是数学家的总结),不过它们的h(x)的表达式改变了。
高级算法对梯度下降的引用:fminunc函数
对于不同的问题,使用梯度下降算法,它们之间的不同点在于
1:所选的代价函数不同,因此它们对每个参数的偏导数的计算结果也不同。
2:达到最优点,迭代的次数不同。
并且通过学习梯度下降算法,我们知道对于各个参数的偏导数其实只用求解一次表达式即可,后面每次迭代只用代入不同的参数值即可。
而有关具体的迭代更新过程,都是相同的,学习率也可以进行自动选择,因此这些相同的过程可以使用一个高级算法函数来表示,再像此函数输入不同的参数(不同点)即可,fminunc就是这样的函数。
上图就是使用fminunc函数的一个简单的例子。我们只需要在costFunction中写出代价函数J的表达式,并计算出每一个参数的偏导数表达式,设置引用外部代价函数,设置最大的迭代数为100,初始化theta向量即可。
fminunc函数会返回:最优的theta值、代价函数的最小值、函数是否收敛的信息。
下图为写costFunction函数的一般步骤:
一对多分类算法
如上图所示,现在有多分类问题(三角形,矩形,叉)。我们知道一个逻辑回归函数只能将样本分为不同的两类0和1,并且h(x)的值表示样本为1的概率。现在对于多类问题,我们的处理是用不同的预测函数hi(x)计算出新的样本属于每一类的概率,最后选定概率最大的类。
对于上图问题,我们先将三角形看为1类,其他的看为0类,这就变成了我们熟悉的二类问题了,通过拟合样本训练得到h1(x),可以计算出新的样本为三角形这一类的概率。对于矩形和叉同理,训练出的h2(x),h3(x)分别表示新的样本为矩形或叉这一类的概率。最后比较三个函数值的大小,将新样本归为最大值的那一类。