本篇博文主要介绍机器学习当中相对简单但又是工程中经常用到的逻辑回归算法,读者如果能够对前两篇博文Linear Regression(一)和Linear Regression(二)有一个相对深入的了解,那么理解逻辑回归也就不是什么难事了。
逻辑回归跟线性回归的某些部分有时候看起来真的很像,特别是遇到梯度下降算法的时候,而且Andrew的例子在线性回归部分和逻辑回归部分都是最终求解一个回归分类线,这就使得初学者可能会对两个算法之间产生一些混淆,然而这两个算法其实是完全不同的两类算法,在线性回归中我们最终得到的是一个具体的预测数值,而在逻辑回归中我们最终得到的是一个分类标签数值(例如0或者1);
我们称之为logistic函数或者sigmoid函数,
而g(z)函数的作用是将θTX=θ0X0+θ1X1+θ2X2+.........+θnXn隐射到(0,1)的区间内,以方便我们进行0或1类的判断;
g(z)函数图形如上,图中我们应该注意的地方:g(z)中当z=0时是分界点,对应着f=θx=0
g(z)函数求导的一个性质为:
我们会在接下来的推导过程用到;
我们依然采用似然函数最大化的思想来进行求解,首先给出似然函数表达式:
分表代表为1类的概率和0类的概率,把他们和写在一起为:
由似然函数定义,又m个样本是相互独立的,所以得:
写成对数函数的形式即:
使用梯度上升的方法(同样也是更新权重的方式)最大化似然函数,梯度上升与梯度下降相比就是符号发生了变化,由负变成了正!
最终我们得到梯度更新的公式为:
我认为梯度上升与之前提到的梯度下降没有本质上的差别,变化的只有权重更新公式中的一个符号,感性上可以理解为一个沿最快往下走,一个是沿最快往上走而已。
我们可以发现在逻辑回归中梯度的更新公式跟线性回归中的最小均方算法惊人的相似,这两个之间有什么的联系呢?我们将在GLM即广义线性模型当中继续讲解;
插播题外话:感知机学习算法
在学习神经网络算法模型的时候,开篇往往会介绍神经网络算法的基本组成即感知机学习模型,而在感知机学习模型中我们依然可以看到逻辑回归的影子;如果我们将逻辑回归当中的sigmoid函数更改为如下的形式:
同时权值更新的公式依然为
这样的算法我们称之为感知机学习算法;我们发现感知机学习算法,逻辑回归算法,还有最小均方误差算法都有相似的地方,但其实他们属于不同类的算法;尤其感知机算法至今我们无法给出合适的概率解释;
回到正题:最大化似然函数的另外一种方法牛顿法
首先我们来看一下泰勒公式(泰勒公式可以理解为一种通过附近点和导数的方式来无限逼近函数的方法)
我们只取它的一阶泰勒展开公式部分;
我们可以通过图形来进一步验证我们的公式,通过图形三角我们可以看出牛顿法一步一步迭代逼近零点的方式:
如此循环往复的迭代下去我们就可以无限的逼近我们的零点;
我们要最大化似然函数L(θ),最大化似然函数必然就要L(θ)的导数为零,L(θ)'=0;
所以公式就转化为了如下形式,如此循环往复迭代下去,最终我们无限接近L(θ)'=0对应的点;
那么我们应该如何应用Hessian矩阵来实现呢?那么公式又来了:
此为应用Hessian矩阵更新权值的方式;
其中Hessian矩阵每一个成员为
我们应该时刻谨记【在矩阵运算当中,乘以所有的m(样本点个数),所有的j(特征值参数值个数)】
牛顿法的一些具体细节推导:
这其中π(x)就是h(x),如右图
由此我们可以写出Hessian矩阵的表达式如下:
就是Hessian矩阵;
权值更新法则;
其中A和H都是负定的,所以一定是存在极值最优解的,所以我么要对A进行一个稍微的变换,即
那么新的Hessian矩阵为:
牛顿法实现逻辑回归分类:
下面使用牛顿法来实现一个小例子,这里给出的训练样本的特征为80个学生的两门功课的分数,样本值为对应的同学是否允许被上大学,如果是允许的话则用’1’表示,否则不允许就用’0’表示,这是一个典型的二分类问题。在此问题中,给出的80个样本中正负样本各占40个;
<span style="font-family:Microsoft YaHei;">% Exercise 4 -- Logistic Regressionclear all; close all; clcx = load('ex4x.dat'); y = load('ex4y.dat');%加载数据[m, n] = size(x); %数据为m行n列% Add intercept term to xx = [ones(m, 1), x]; % m行3列% Plot the training data% Use different markers for positives and negativesfigurepos = find(y==1); neg = find(y == 0);%正例与反例的下角标 find返回下角标plot(x(pos, 2), x(pos,3), '+') %正例用“+”,反例用“o”标注hold on %矩阵是以1开头的plot(x(neg, 2), x(neg, 3), 'o')hold onxlabel('Exam 1 score')ylabel('Exam 2 score')% Initialize fitting parameterstheta = zeros(n+1, 1); %3行1列的0矩阵% Define the sigmoid functiong = inline('1.0 ./ (1.0 + exp(-z))'); %inline的作用为直接定义一个函数表达式% Newton's methodMAX_ITR = 7;J = zeros(MAX_ITR, 1);for i = 1:MAX_ITR % Calculate the hypothesis function z = x * theta; h = g(z); % Calculate gradient and hessian. % The formulas below are equivalent to the summation formulas % given in the lecture videos. grad = (1/m).*x' * (h-y); H = (1/m).*x' * diag(h) * diag(1-h) * x; %Hessian矩阵表达式 % Calculate J (for testing convergence) J(i) =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h)); %矩阵运算注意点乘 %我认为J表示为负值,同时grad符号也发生了变化, %是为了使本来梯度上升来最大化似然函数转化为梯度下降来似然函数最小化 theta = theta - H\grad;end% Display thetatheta% Calculate the probability that a student with% Score 20 on exam 1 and score 80 on exam 2 % will not be admittedprob = 1 - g([1, 20, 80]*theta)% Plot Newton's method result% Only need 2 points to define a line, so choose two endpointsplot_x = [min(x(:,2))-2, max(x(:,2))+2]; %取两个值,% Calculate the decision boundary lineplot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1)); </span>
<span style="font-family:Microsoft YaHei;"><strong>%θ1X0+θ2X1+θ3X2=0得出X2的表达式:X2=(-1/θ3).*(θ1+θ2X1) 注意X1是一个数组也就是plot_x</strong>plot(plot_x, plot_y)legend('Admitted', 'Not admitted', 'Decision Boundary')hold off% Plot Jfigureplot(0:MAX_ITR-1, J, 'o--', 'MarkerFaceColor', 'r', 'MarkerSize', 8)xlabel('Iteration'); ylabel('J')% Display JJ </span>
参考资料:
http://blog.csdn.net/acdreamers/article/details/44658249
http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex4/ex4.html