逻辑回归(logistic regression)及其Python实现

来源:互联网 发布:stc的16位单片机 编辑:程序博客网 时间:2024/06/06 06:45

逻辑回归(logistic regression)

逻辑回归(LogisticRegression)是机器学习中的一种分类模型,由于算法的简单和高效,在实际中应用非常广泛。它虽然它名字里面有“回归”两个字,却不是一个回归算法,而是一个分类模型,它是被用来做分类的。之所以称之为回归,是因为它的学习的是模型模型的参数以最佳拟合已有的数据。(比如,根据已有的一些点,回归出它的直线参数的拟合过程,就称之为回归。)逻辑回归其实仅为在线性回归的基础上,套用了一个逻辑函数。

一.逻辑回归模型的优缺点:

1.     优点:训练快、易理解、易实现、可用于概率预测,也可用于分类、各feature之间不需要满足条件独立假设,但各个feature的贡献是独立计算的;

2.     缺点:模型不够强大、拟合能力有限,欠拟合,对于复杂的任务效果不够好、仅能用于线性问题;

二.介绍一下逻辑回归所用到的Sigmoid函数:



  由图可知,sigmoid的函数输出是介于(0,1)之间的,中间值是0.5。当x>0时,输出值大于0.5,归于A类;当x<0时,输出值小于0.5,归于B类;当x=0时可自己规定属于哪一类。

三.构造预测函数

    对于样本容为m的数据,每个样本有n个特征(feature)X和一个输出y,即 

   给定权重向量

                                                                            

    由此,预测函数有,其中

    预测函数的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:

    

    

四.运用极大似然估计法构造成本函数(cost function)

    由上述两个概率公式得

                                  

    因为各feature之间不需要满足条件独立假设,但各个feature的贡献是独立计算,所以它们的联合分布可以表示为各个样本非让你不的乘积,取似然函数为:

             

    取对数似然函数:

                          

    最大似然估计就是求使对数似然函数取得最大值时,得到的参数就是最佳参数。

    所以我们构造cost函数为:

                  

    我们求对数似然函数取得最大值就是求cost函数的最小值。此时可以用梯度下降法求。

五.梯度下降法求最小值

1.批量梯度下降法BGD

因为函数g(z)的特性,所以

     

    

    

    

    

    

    设置步长为α,则θ的更新公式为:

    

    θ更新公式的矩阵形式是:


2.随机梯度下降算法(Stochastic GradientDescent, SGD)

    我们之前用的梯度下降法要遍历训练数据中所有的样本进行计算,我们称这种算法叫做批梯度下降(Batch Gradient Descent)。但是当样本特别大时,计算量就很大。这时,我们可以用随机梯度下降法,即每次更新权值θ,只选一个样本进行计算。更新公式为:


3.小批量梯度下降法(Mini-batch Gradient Descent, MBGD)

    对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。这时我们选择一个折中的方法小批量梯度下降法。

    对于大小为m的样本,我们每次迭代更新权值θ时,选择x(1<k<m)个样本进行计算。更新公式为:


4.批量梯度下降法BGD、随机梯度下降算法SGD、小批量梯度下降法MBGD的比较

(1)   随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将θ迭代到最优解了,而批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较 BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。

(2)   随机梯度下降中,虽然不是每次迭代得到的损失函数都向着全局最优方向,但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近。

(3)   梯度法对步长不敏感,随机梯度对步长选择敏感;梯度法对初始点(参数)选择敏感。

(4)   多数情况下,MBGD会比SGD收敛要速度快。在训练样本多的情况下,SGD比BGD的收敛速度快,一个原因是BDG要通过所有样本计算梯度,而SGD通过一个样本计算一个近似的梯度,本身计算量就会小的多。


六.python代码实现

from numpy import *def loadDataSetTrain(filename):    #载入训练数据    dataMat=[]    labelMat=[]    fr=open(filename);    for line in fr.readlines():     #读取文件        lineArr=line.strip().split('\t')     #去除每一行中的空格        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])        labelMat.append(int(lineArr[2]))    return mat(dataMat),mat(labelMat)def loadDataSetTest(filename):       #载入测试数据    dataMat=[]    fr=open(filename);    for line in fr.readlines():        #读取文件        lineArr=line.strip().split('\t')     #去除每一行中的空格        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])    return dataMatdef sigmoid(inX):    return 1.0/(1+exp(-inX))     #使用sigmoid函数def logisticRegression(dataMat,labelMat,m,n,k):  #更新权值,k是循环次数    X=dataMat.T    Y=labelMat    theta=mat(ones(n))        #初始化权重矩阵    for i in range(k):        theta=theta-0.2/m*(sigmoid(theta*X)-Y)*X.T    #更新公式    return thetadef classifyVector(testData,theta):    prob=sigmoid(theta*testData)    return probdataMat,labelMat=loadDataSetTrain('E:\\python\\machine_learning\\train.txt')m,n=shape(dataMat)       #样本数据有m个,加上偏置相有特征值n个testData=loadDataSetTest('E:\\python\\machine_learning\\test.txt')testData=mat(testData).T      #测试数据theta=logisticRegression(dataMat,labelMat,m,n,1000)x=classifyVector(testData,theta)xx=x.tolist()print(xx)


原创粉丝点击