吴恩达机器学习笔记之Logistic回归

分类问题(classification):

分类问题的输出一般是有限个离散的值,此时线性回归(linear regression)就不适用了,如果是简单的0和1分类,因为线性回归的输出值是连续的并且可能远远大于1或者远远小于0,并且线性回归的假设函数会受到样本的影响而发生改变,此时预测的结果可能就会发生很大的偏差。

Logistic regression是一种分类算法,虽然它的名字里面有回归,但是它事实上是一种分类算法。

逻辑回归假说表示(Logistic Regression Hypothesis Representation):

之前我们的线性回归的假设函数输出是一个任意的值,现在我们通过改变形式,使它的输出始终在0-1之间。

Sigmoid function and Logistic function:它的输出值永远在0-1之间。

g(z) = \frac{1}{1 + e^{-z}}

这个函数的图像为:

Python代码实现为:

import numpy as np
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

h_{\theta }(x)的作用是,对于给定的输入变量,根据选择的参数计算输出变量=1的可能性,即

决策边界(Decision Boundary):

决策边界只是假设函数的一个属性,数据集不是用来显示决策边界的,而是用来训练拟合参数\theta的,但是一旦参数\theta确定了,决策边界也就确定了。

从上面的sigmoid函数我们可以看出来,如果我们当输出值大于等于0.5判定为1,小于0.5判定为0时,对应的是\theta ^{T}X大于等于0,和小于0。

我们不仅仅可以用直线来作为决策边界,还可以用之前说到的多项式拟合作为决策边界。

代价函数(Cost Function):

怎么去拟合参数\theta。在线性回归中,我们是通过定义代价函数,并且通过梯度下降的方法使得代价函数最小来求拟合的参数\theta,代价函数定义为预测值与实际值的误差平方和。

在Logistic Regression中我们用类似的方法去做,但是此时如果代价函数也定义成预测值与实际值的误差平方和的话,那么代价函数的图像有可能是下面左边这种类型:(注意,Logistic Regression的代价函数也是大于等于0 的。)

这样的函数我们称之为非凸的,他有局部最优解,因此在应用梯度下降的方法时,它不一定能收敛到全局最优解,因此我们希望提出另一种代价函数,使得它的图像如上图右边所示是一个凸函数;我们提出如下的代价函数

他们的图像分别如下图所示:代表,如果实际值为1,预测值为1时,代价函数为0,否则为无穷大,反之亦然。

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(sigmoid(X * theta.T)))
    return np.sum(first - second) / (len(X))

MATLAB代码实现为:

first = y .* log(sigmoid(X * theta)); %注意这里应该是y点乘矩阵而不是y转置之后在相乘
second = (1 - y) .* log(1 - sigmoid(X *theta));
J = -1 * sum(first + second) ./ m 

简化代价函数与梯度下降(Simplified Cost Function and Gradient Descent):

我们之前说到Logistic Regression的代价函数可以写成下面这种形式:

为了更好的分析代价函数,我们对它进行简化,因为y的取值只有0或者1,因此上面的代价函数又可以写成下面这种形式:

这个代价函数是通过统计学中的极大似然法得到的。

为了获得最好的预测效果,我们也是使用梯度下降的方法对参数\theta进行更新,具体过程参见下图,从图中我们会发现Logistic Regression 的梯度更新公式形式上与线性回归一模一样,但是我们要注意的是,这里的h_{\theta }(x)已经发生了变化。

注意:下面的公式当中后面偏导的那一项,缺少了一个1/m的系数。

一种梯度下降和梯度更新的的实现方式为:注意在进行梯度更新之前,特征缩放仍然是非常重要的。

高级优化(Advanced Optimization):
除了梯度下降算法以外,还有很多更复杂和更优越的算法,比如:共轭梯度(Conjugate Gradient),局部优化法(Broyden Fletcher goldfarb shann,BFGS)以及有限内存局部优化法(LBFGS),fminunc是matlab和Octave中都带的一个最小值优化函数,使用时我们需要提供代价函数个每个参数的求导。下面是示例:

function [jVal, gradient] = costFunction(theta)
    jVal = [...code to compute J(theta)...];
    gradient = [...code to compute derivative of J(theta)...]
end

%GradObj表示梯度目标,On表示打开,MaxIter表示最大的迭代次数
options = optimset('GradObj', 'on', 'MaxIter', 100);
%初始化theta
initialTheta = zeros(2,1);
%exitFlag可以表示该算法是否收敛,theta的维数需要大于等于2,
%否则fminunc函数可能不会正常工作
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);

多元分类:一对多(Multiclass Classification One-vs-all):

相比于之前说的二元分类,现在分类的结果不止两种,有若干种,比如预测天气,下雨、晴天、阴天、下雪等等;

一对多的分类问题,我们可以把它化成多个二元分类问题,即训练多个二元分类器:下图展示了结果有三类的分类问题的过程,

具体的,我们通过对每个类别都训练一个分类器,然后对于一个待分类的值x,我们分别预测它属于不同种类的概率,然后输出属于种类概率最大的那一个。

猜你喜欢

转载自blog.csdn.net/blue_coffeei/article/details/86530760
今日推荐