首页 > 代码库 > 逻辑回归
逻辑回归
一、逻辑回归的认识
逻辑回归是一个用来解决二分类的简便方法。先来看看逻辑回归解决二分类的基本思想。
之前写了线性回归,现在写逻辑回归~都叫回归,有什么不同呢?这里写逻辑回归又提到线性回归,他们又有什么联系呢?
首先,从机器学习的角度说一下。机器学习中,有两个问题是比较相似的,即预测和分类。通常将模型的输出是有限的离散值的问题称为分类问题,而将模型的输出是连续值的问题称为预测。不同的两个问题自然有不同的解决方法,对于预测问题,通常采用回归分析的方法,比如之前线性回归对于输入样本$x$,模型的输出为$y={{h}_{\theta }}(x)={{\theta }^{T}}x$,这里的取值是连续性的。
那么回归分析一般是用来做预测的,可不可以用来做分类呢?试想一下,我们用线性回归来解决二分类问题,如果其输出$y$的取值拿一个阈值$\tau $卡一下,对于输出$y<\tau $的样本分为一类,对于输出$y\ge \tau $的样本分为另一类,这不就好了么?问题是对于线性回归的输出的取值范围是没有大小边界的,那么这个阈值$\tau $怎么取就没法弄了。
与线性回归不同,逻辑回归输出的取值范围是0到1之间,这样的话,选一个阈值$\tau $似乎比较可行了,为了说明怎么选,先看看逻辑函数(也叫sigmod函数)长啥样吧~逻辑函数的定义是这样的$g(z)=\frac{1}{1+{{e}^{-z}}}$,$z\in {{\mathbb{R}}^{1}}$ ,$g(z)\in (0,1)$。它的图形长这样:
现在可以看出我们选的阈值应当是0.5,因为从图形上看,函数值取0.5时对应的自变量取值为0,而整个曲线是关于(0,0.5)中心对称的,这意味这选这个点对两类样本而言是比较公平的(可以这么理解吧~)。
说的差不多了,唯一的问题就是上面逻辑函数中的$z$了,也就$z$是和样本$x$之间的关系。它们什么关系呢?逻辑函数取得就是线性关系$z={{\theta }^{T}}x$。现在啥都有了,逻辑回归的模型也可以写出来了
${{h}_{\theta }}(x)=g({{\theta }^{T}}x)=\frac{1}{1+{{e}^{-{{\theta }^{T}}x}}}$
现在可以回答文章开头提出的两个问题了。(1)它们有何不同呢?模型输出取值范围不同,使得逻辑回归可以用来解决二分类问题;(2)它们有何联系呢?没什么联系,无非就是形式上看,逻辑回归就是将线性回归的模型${{\theta }^{T}}x$带入逻辑函数中。(没什么联系说个蛋啊!因为之前看到有人认为,可以简单理解为逻辑回归是对线性回归的结果做了一个逻辑函数的转换,然后用来做二分类,这里想说明这种说法不正确,下面分析)。
二、逻辑回归求解
逻辑回归的基本模型已经有了${{h}_{\theta }}(x)=g({{\theta }^{T}}x)=\frac{1}{1+{{e}^{-{{\theta }^{T}}x}}}$,那么怎么求解呢?好像没说解什么呢^_^,当然是解参数$\theta $了,我们要找个$\theta $使得我们的模型是最优的嘛,参数估计问题~所以,先写出对数似然函数吧!
$\ell (\theta )=\log \prod\limits_{i=1}^{m}{p({{y}^{(i)}}|{{x}^{i}},\theta )}$,其中m是样本数目,i是样本编号。感觉怪怪的,突然冒出一个${{y}^{(i)}}$来,而且${p({y^{(i)}}|{x^i},\theta )}$也不知道啊。。。${{y}^{(i)}}$是啥呢,当然是样本类别了,我们不是要分类吗,每个样本本身当然有个类别了,这里是二分类就取0或者1吧。接着来看${p({y^{(i)}}|{x^i},\theta )}$,没法求吧,因为我们还没对${y^{(i)}}|{x^i},\theta$建模啊,模型都没有,概率当然求不了。${{y}^{(i)}}$的取值只有0和1两个,所以它应当是一个伯努利分布,我们需要确定分别取这两个值的概率。回顾一下上面的${{h}_{\theta }}(x)$,其取值范围为(0,1),这不正好嘛,${{y}^{(i)}}$取值的概率本身就是0和1之间的么!好了,干脆直接让$p(y=1|x,\theta )={{h}_{\theta }}(x)$,$p(y=0|x,\theta )=1-{{h}_{\theta }}(x)$得了,这正好符合概率的定义的。那这样做有什么意义呢?回顾上面的内容,当${{h}_{\theta }}(x)$小于0.5时,我们将样本分类为类别0,否则分类为类别1,这样的话取值范围为(0,1)的${{h}_{\theta }}(x)$是不是可以衡量样本属于类别1的概率呢?结合逻辑回归函数的曲线看,$z={{\theta }^{T}}x$比0大的越多,${{h}_{\theta }}(x)$取值越是偏离阈值0.5而离1越近,这意味这这个样本的分类越不模糊,很明确的属于其中一个类,相反${{h}_{\theta }}(x)$取值越是偏离阈值0.5而离0越近,样本越是很明确的属于另一个类别。这样的话,样本归为类别1的概率就是${{h}_{\theta }}(x)$,归类为样本0的概率就是$1-{{h}_{\theta }}(x)$。好了,${y^{(i)}}|{x^i},\theta$的模型好了,即$p({{y}^{(i)}}=1|{{x}^{(i)}},\theta )={{h}_{\theta }}({{x}^{(i)}})$,$p({{y}^{(i)}}=0|{{x}^{(i)}},\theta )=1-{{h}_{\theta }}({{x}^{(i)}})$
将他俩写出一个式子
$p({{y}^{(i)}}|{{x}^{(i)}},\theta )={{({{h}_{\theta }}({{x}^{(i)}}))}^{{{y}^{(i)}}}}{{(1-{{h}_{\theta }}({{x}^{(i)}}))}^{1-{{y}^{(i)}}}}$
现在,可以接着写似然函数了
$\begin{align*}\ell (\theta )&=\log \prod\limits_{i=1}^{m}{p({{y}^{(i)}}|{{x}^{i}},\theta )} \\ & =\sum\limits_{i=1}^{m}{\log ({{({{h}_{\theta}}({{x}^{(i)}}))}^{{{y}^{(i)}}}}{{(1-{{h}_{\theta }}({{x}^{(i)}}))}^{1-{{y}^{(i)}}}})} \\& =\sum\limits_{i=1}^{m}{\left( {{y}^{(i)}}\log({{h}_{\theta }}({{x}^{(i)}}))+(1-{{y}^{(i)}})(1-{{h}_{\theta}}({{x}^{(i)}})) \right)} \\\end{align*}$
之前提到有人认为可以简单理解为逻辑回归是对线性回归的结果做了一个逻辑函数的转换,然后用来做二分类,现在有了似然函数就可以理解这种说法不准确了,因为两者求解的目标是不一样的,在逻辑回归的似然函数中,不存在线性回归中优化最小二乘的目标。
现在优化这个似然函数使其取最大值就可以了。
对$\theta $的第$l$个分量${{\theta }_{l}}$求偏导
$\begin{align*}\frac{\partial \ell (\theta )}{\partial {{\theta }_{l}}}&=\frac{\partial \sum\limits_{i=1}^{m}{\left( {{y}^{(i)}}\log ({{h}_{\theta }}({{x}^{(i)}}))+(1-{{y}^{(i)}})(1-{{h}_{\theta }}({{x}^{(i)}})) \right)}}{\partial {{\theta }_{l}}} \\& =\sum\limits_{i=1}^{m}{\left( {{y}^{(i)}}\frac{1}{{{h}_{\theta }}({{x}^{(i)}})}+(1-{{y}^{(i)}})\frac{1}{1-{{h}_{\theta }}({{x}^{(i)}})} \right)}\frac{\partial {{h}_{\theta }}({{x}^{(i)}})}{\partial {{\theta }_{l}}} \\& =\sum\limits_{i=1}^{m}{\left( {{y}^{(i)}}\frac{1}{{{h}_{\theta }}({{x}^{(i)}})}-(1-{{y}^{(i)}})\frac{1}{1-{{h}_{\theta }}({{x}^{(i)}})} \right)}\frac{\partial g({{\theta }^{T}}{{x}^{(i)}})}{\partial {{\theta }_{l}}} \\& =\sum\limits_{i=1}^{m}{\left( {{y}^{(i)}}\frac{1}{{{h}_{\theta }}({{x}^{(i)}})}-(1-{{y}^{(i)}})\frac{1}{1-{{h}_{\theta }}({{x}^{(i)}})} \right)}g({{\theta }^{T}}{{x}^{(i)}})(1-g({{\theta }^{T}}{{x}^{(i)}}))\frac{\partial {{\theta }^{T}}{{x}^{(i)}}}{\partial {{\theta }_{l}}} \\ & =\sum\limits_{i=1}^{m}{\left( {{y}^{(i)}}(1-g({{\theta }^{T}}{{x}^{(i)}})-(1-{{y}^{(i)}})g({{\theta }^{T}}{{x}^{(i)}}) \right)}x_{l}^{(i)} \\& =\sum\limits_{i=1}^{m}{({{y}^{(i)}}-}g({{\theta }^{T}}{{x}^{(i)}}))x_{l}^{(i)} \\\end{align*}$
注意${{h}_{\theta }}({{x}^{(i)}})=g({{\theta }^{T}}{{x}^{(i)}})$且上式利用逻辑函数求导结果$g{{(z)}^{‘}}=g(z)(1-g(z))$
要得到解析解,可以令偏导为0,解一下${{\theta }_{l}}$,不过解一下就会发现上面的式子不好解。所以为了求解参数$\theta $,用最优化的方法吧~牛顿法,梯度法之类的。
另外一个问题,这个似然函数能不能求最大值呢?也就是说它万一是个凸函数,就可能有最小值而没最大值了,所以我们需要证明个个函数是个凹函数,这样利用优化方法找到一个局部极大值就是全局最大值了,好了,来证其Hessien矩阵半负定吧~
利用上面对${{\theta }_{l}}$的求导结果,Hessian矩阵第$k$行第$l$列的元素
$\begin{align*}{{H}_{kl}}&=\frac{{{\partial }^{2}}\ell (\theta )}{\partial k\partial l} \\& =\frac{\partial \sum\limits_{i=1}^{m}{({{y}^{(i)}}-}g({{\theta }^{T}}{{x}^{(i)}}))x_{l}^{(i)}}{\partial {{\theta }_{k}}} \\ & =\sum\limits_{i=1}^{m}{-g({{\theta }^{T}}{{x}^{(i)}})(1-g({{\theta }^{T}}{{x}^{(i)}}))}x_{l}^{i}x_{l}^{(i)} \\\end{align*}$
那么$H=\sum\limits_{i=1}^{m}{-g({{\theta }^{T}}{{x}^{(i)}})(1-g({{\theta }^{T}}{{x}^{(i)}}))}{{x}^{(i)}}{{x}^{(i)T}}$
对于任意非零向量$p$有
$\begin{align*}{{p}^{T}}Hp&=\sum\limits_{i=1}^{m}{-g({{\theta }^{T}}{{x}^{(i)}})(1-g({{\theta }^{T}}{{x}^{(i)}}))}{{p}^{T}}{{x}^{(i)}}{{x}^{(i)T}}p \\& =-\sum\limits_{i=1}^{m}{g({{\theta }^{T}}{{x}^{(i)}})(1-g({{\theta }^{T}}{{x}^{(i)}}))}{{({{p}^{T}}{{x}^{(i)}})}^{2}} \\\end{align*}$
由于$0<g({{\theta }^{T}}{{x}^{(i)}})<1$,所以${{p}^{T}}Hp\le 0$,所以似然函数的Hessien矩阵半负定,它是一个凹函数,这样,利用最优化方法求一个矩阵极大值就可以了。
三、逻辑回归干了干啥
上面推导了逻辑回归的求解的过程,乱乱的,简单总结一下逻辑回归干了个啥吧~
回顾似然函数$\ell (\theta ) = \log \prod\limits_{i = 1}^m {p({y^{(i)}}|{x^i},\theta )}$,我们的目标要最大化这个东西,也就是要最大化连乘符号里面的每一项$p({{y}^{(i)}}|{{x}^{(i)}},\theta )={{({{h}_{\theta }}({{x}^{(i)}}))}^{{{y}^{(i)}}}}{{(1-{{h}_{\theta }}({{x}^{(i)}}))}^{1-{{y}^{(i)}}}}$,它怎么才能大呢?考虑单个样本$x$如果它对应类别$y=1$,那么$p(y|x,\theta )={{h}_{\theta }}(x)$,所以${{h}_{\theta }}(x)$要比较大才好,而${{h}_{\theta }}(x)=g({{\theta }^{T}}x)=\frac{1}{1+{{e}^{-{{\theta }^{T}}x}}}$,所以${{\theta }^{T}}x$要大于0比较好(结合逻辑函数曲线看看);相反如果$y=0$,最大化似然函数则要求${{\theta }^{T}}x$尽可能小于零。
所以最大化似然函数的解就是找到一个$\theta $,是得对于类别为1的样本,尽可能满足${{\theta }^{T}}x>0$,而对于类别为0的样本,尽可能满足${{\theta }^{T}}x<0$。换句话说,我们找到的超平面${{\theta }^{T}}x=0$用来对样本分类。
四、简单实现
1 #l逻辑函数 2 logistic<-function(x){ 3 return(1/(1+exp(-x[1]))); 4 } 5 6 #似然函数 7 ll<-function(theta,x,y){ 8 n=ncol(x); 9 m=nrow(x);10 l<-0;11 for(i in seq(1,m)){12 xi<-matrix(x[i,],ncol=1);13 hxi<-logistic(t(xi)%*%theta);14 l<-l+y[i]*log(hxi)+(1-y[i])*log((1-hxi))15 }16 return(-l) #取负值为了使用下面的nlm()函数17 }18 19 #读入数据,数据来自Andrew Ng机器学习资料20 x<-read.table("q1x.txt");21 x<-as.matrix(x);22 x<-cbind(rep(1,99),x);23 y<-scan("q1y.txt");24 y<-matrix(y,ncol=1);25 n=ncol(x);26 m=nrow(x);27 28 theta<-rep(0,n);29 theta<-matrix(theta,ncol=1);30 result<-nlm(ll,theta,x,y);#nlm()为R运用牛顿法求解函数极小值的函数31 32 est<-result$estimate;33 34 35 plot(x[1:50,2:3],type="p",col="red",xlim=c(0,8), ylim=c(-4,3));36 points(x[51:99,2:3],type="p",col="blue");37 abline(-est[1]/est[3],-est[2]/est[3]);
参考资料:Andrew Ng机器学习视频、资料+其他乱七八糟
逻辑回归