模型目的
此模型用于解决监督学习中的分类问题。现实生活中分类问题有很多,例如垃圾邮件的分类、学生成绩层次的划分、恶性肿瘤和良性肿瘤的划分等等。为了解决这类问题,我们建立了逻辑回归模型(logistic regression model)。
二元分类
我们从最简单的二元分类开始,首先作以下规定:
: 表示训练样本个数
:输入变量
:输出变量,
0:Nagative 1:Positive
:一个训练样本
:第
个训练样本
:目标函数,映射
我们想得到这样一个函数,它的函数值应是输出值为1的概率,并且当函数值高于0.5,我们认为预测结果为1,当函数值低于0.5,我们认为预测结果为0,很明显,函数的值域应该是[0, 1]。为了符合这个函数的特性,我们引入sigmoid函数(也称logistic函数)。
函数表达式是,观察其函数图像:
很明显其值域为[0, 1],我们知道线性回归模型的目标函数为,为了既用到特征值又保证值域,我们将sigmoid函数与线性回归模型目标函数结合即可得到逻辑回归模型的目标函数:
此时即给定输入特征值和
值时,输出变量为1的概率。
观察sigmoid函数,我们还可以发现:,即:
。又因为当函数值高于0.5,我们认为预测结果为1,当函数值低于0.5,我们认为预测结果为0。所以
所确定的曲线是0和1的分界线,在逻辑回归模型中,它被称作决策边界(Decision Boundary)。
为了确定值,我们还是像线性回归模型中的那样,寻找代价函数最小的值对应的
即可。引入逻辑回归模型中代价函数的定义,由于
的值是离散的,线性回归模型中的代价函数并不适用于此,我们建立了新的代价函数,确保其最优解有且仅有一个,即全局最优解。
同样的,我们使用梯度下降算法迭代获得,这里给出结论:
repeat until convergence{
}
事实上,如果你足够了解线性回归模型,你会发现这和线性回归模型并无二致。
到这里,我们已经完成了对值的求解,但实际运用我们会发现,其运行速度十分缓慢,这是因为我们采用的是原始的梯度下降算法,并没有进行一定的优化,其迭代次数是非常之多的。
此时,我们可以选用MATLAB或是Octave函数库中的高级优化算法,例如fminunc算法,我们只需要计算代价函数值和梯度下降算子,并作为参数传入这个算法中即可,速度十分快。
function [J, grad] = costFunction(theta, X, y)
% Initialize some useful values
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));
cost = -1/m*sum((log(sigmoid(X*theta)).*y)+(log(1-sigmoid(X*theta)).*(1-y)));
grad = (1/m*(sigmoid(X*theta)-y)'*X)';
J = cost;
end
% Set Options
options = optimset('GradObj', 'on', 'MaxIter', 400);
% Optimize
[theta, J, exit_flag] = ...
fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);
在python中,我们可以使用scipy库中的TNC算法,具体操作和MATLAB类似。
多元分类
多元分类是基于二元分类的,任意一个多元分类问题都可以转化为几个二元分类问题的和。假设存在三类,我们只需要把第一类设为1,其它两类均设为0,然后应用二元分类,得到一个目标函数,它的函数值的意义是给定输入变量和
值,输出值为1的概率也即是第一类的概率,同理我们可以得到
、
。当我们给定输入变量和
值,我们的预测类即为使
最大的第
类。
代码实现
通过matlab编程和python编程,我分别实现了由梯度下降法和高级优化算法求解逻辑回归模型的步骤,结果类似,拟合效果较好。全部代码已上传至github(example文件夹中的ex2)。
若有任何问题,欢迎指正,也欢迎讨论。