Logistic回归
简述逻辑斯谛回归算法原理和代码实现
一、Hypothesis
Logistic回归用回归思想的分类算法
利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。
优点:计算代价不高,易于理解和实现。
缺点:容易欠拟合,分类精度可能不高。
适用数据类型:数值型和标称型。
Sigmoid函数
在Logistic回归中,我们需要的函数是,能接受所有的输入然后预测类别。
LR一般应用Sigmoid函数:
![c9a04b1ebf286a0b17933103736599b0.png](https://i-blog.csdnimg.cn/blog_migrate/d48f8828abe5330719562c0a5f0ef4ad.png)
当x为0时,Sigmoid函数值为0.5,随着x的增大,对应的Sigmoid函数值将逼近于1;而随着x的减小,Sigmoid函数值将逼近于0。横坐标足够大时,Sigmoid函数看起来像一个阶跃函数。
![9ee229b9672180e0606ba7f95a0f5df6.png](https://i-blog.csdnimg.cn/blog_migrate/1c31215160c01f2db2c02bc93650848c.png)
为了实现LR回归分类器,我们在每个特征上都乘以一个回归系数,然后把所有的结果值相加,即z=w0x0+w1x1+w2x2+...+wnxn,代入到Sigmoid函数中,进而得到一个范围在0~1之间的数值。大于0.5的数据被分入1类,小于0.5即被分入0类。
二、目标函数
因为Sigmoid函数是非凸函数,如果采用平方误差和作为目标优化函数,则无法直接使用梯度上升法。于是我们应用极大似然估计法估计模型参数。
设:
![71aa5875d9b565bc6d72067f6f8dd254.png](https://i-blog.csdnimg.cn/blog_migrate/0e4e792d29df0006525d605d2bd877f6.png)
得到目标函数:
![bc27c4ef63f810358a2c07ab3d0ae96b.png](https://i-blog.csdnimg.cn/blog_migrate/086977cc03eb5074f91fbfa1dca9aee9.jpeg)
对L(W)求极大值,得到w回归系数的估计值。
三、最优化方法
梯度上升法
确定分类器函数形式之后,现在问题变成了:找到最佳回归系数,从而使分类器尽可能地准确。
梯度上升法基于的思想是:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。
迭代公式如下:
w:w+a*Dwf(w)
f为目标函数,D为梯度,a为步长。停止的条件是迭代次数达到某个指定值或者算法达到某个允许的误差范围。
类比梯度下降法:w:w-a*Dwf(w)
四、训练算法
伪代码如下:
(1)每个回归系数初始化为1
(2)重复R次:
计算整个数据集的梯度
使用alpha*gradient更新回归系数的向量
(3)返回回归系数
下面是梯度上升算法的具体实现:
#加载数据
def loadDataSet():
dataMat=[];labelMat=[] #特征数据和类别标签
fr=open('testSet.txt')
for line in fr.readlines():
lineArr=line.strip().split()
dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat,labelMat
def sigmoid(inX): #sigmoid函数
return 1.0/(1+exp(-inX))
def gradAscent(dataMatIn,classLabels): #梯度上升法
dataMatrix=mat(dataMatIn)
labelMat=mat(classLabels).transpose()
m,n=shape(dataMatrix)
alpha=0.001 #步长
maxCycles=500 #迭代次数
weights=ones((n,1)) #初始回归系数
for k in range(maxCycles):
h=sigmoid(dataMatrix*weights)
error=(labelMat-h)
weights=weights+alpha*dataMatrix.transpose()*error
return weights #返回回归系数
变量alpha是向目标移动的步长,maxCycles是迭代次数。在for循环迭代完成后,将返回训练好的回归系数。敲入下列代码,会得到相应的回归系数。
dataArr,labelMat=loadDataSet()
gradAscent(dataArr,labelMat)
上述就是LR分类算法的基本内容,下面我们说说LR算法与线性回归、SVM的差别。
一、与线性回归的差别
假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合的过程就称作回归。
1. 逻辑回归是以线性回归为理论支持的,但线性回归模型无法做到sigmoid的非线性形式,Logistic回归在线性回归的实数输出范围加上sigmoid函数,将输出值收敛在0~1之间。
2. 逻辑回归和线性回归都是广义的线性回归,线性回归是使用最小二乘法优化目标函数,而逻辑回归是使用梯度上升法或者拟牛顿法。
3. 线性回归在整个实数域范围内进行预测,敏感度一致。而分类范围需要在[0,1],逻辑回归是一种减少预测范围,将预测值限定为[0,1]间的一种回归模型。因而对于二分类问题,逻辑回归的鲁棒性更好。
二,与SVM的关系
1. LR和SVM都可以处理分类问题,且一般都处理二分类问题。
2. LR是参数模型,SVM是非参数模型。
3. LR的目标函数是对数似然函数,SVM的目标函数是hinge损失函数。这两个函数都是增加对分类结果影响较大的数据点的权重,减少影响较小的数据点的权重。
4. 逻辑回归相对来说模型更简单易解,特别是大规模线性分类时比较方便。而SVM的理解和优化相对来说复杂一些,SVM转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算。
5.SVM在分类问题上应用更广,LR分类精确度可能不够高。