logistic回归总结

来源:互联网 发布:柯尔特蟒蛇357淘宝模型 编辑:程序博客网 时间:2024/06/05 03:49

在介绍logistic之前,我希望大家能先思考一个问题,因为在logisitic中会使用到一个最优化算法,梯度上升还有一个与梯度下降,第一个问题就是为什么在logistic中使用的最优化算法是梯度上升而不是梯度下降呢?究竟什么时候应该使用梯度上升算法什么时候应该使用梯度下降算法呢?最小二乘法和极大似然估计与梯度上升算法和梯度下降算法究竟有什么样的联系呢?如果,对这些概念都不清楚的话,下面我会一一为大家解释,并解答这些问题。

一、什么是logistic回归

logistic回归常用于二分类问题,当然,也可以使用在多分类问题中,这里我们主要讨论的是logistic的二分类问题。logistic回归其实它也是一个线性回归,只是它使用了一个海威萨德尔阶跃函数,对这个线性回归的结果进行了处理,将最终的结果装换成了0或者1。



通过海威萨德尔阶跃函数我们就将一个线性回归函数转化成了一个二分类的函数,而我们所要求的参数也正是阶跃函数中的w参数。logistic回归进行分类的主要思想就是:根据现有数据对分类边界线建立回归公式,以此进行分类。回归其实就是指最佳拟合,表示要找到最佳拟合参数集。

二、怎么计算参数

在计算参数的时候,我们会使用一种最优化算法叫梯度上升,还有一个与它相对应的最优化算法叫梯度下降,梯度上升是来用求解极大值,而梯度下降是用来求解极小值的。


具体的推导过程我就不详细推导了,最小二乘法常用于损失函数的求解中,保证损失函数最小化,通过多次迭代使得差值趋于稳定(收敛)或者达到指定的误差范围内,常用于回归函数参数的求解,用于正态分布中。极大似然估计,其实就是利用了已知样本信息(分类的情况)的结果信息,来反推最具有可能(概率最大)这些样本结果出现的模型参数值,下面使用维基百科上的一个例子来详细说明一下极大似然估计,极大似然估计常用于二项分布中,其实logistic回归就是一个二项分布问题(0类或者1类),所以这里采用的是极大似然估计而不是最小二乘法。


三、python代码实现logistic回归

#ecoding:utf8import sysimport numpy as np#读取数据def loadDataSet():    #数据    dataMat =[]    #数据所属类别    labelMat=[]    f = open("testSet.txt")    for line in f.readlines():        #逐行读取数据,去掉空格,并分割字符串        lineArr = line.strip().split()        #1.0代表的是常数项,可以理解为a*x + b*y + c = 0        #而参数a、b、c正是我们需要求解的参数        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])        #数据所属类别        labelMat.append(int(lineArr[2]))    return dataMat,labelMat#海威萨德尔阶跃函数def sigmod(z):    return 1.0/(1+np.exp(z*-1))#梯度上升求解参数def gradAscent(dataMatIn,classLabels):    #将dataMatrix通过numpy转换为矩阵    dataMatrix = np.mat(dataMatIn)    #将labelMat通过numpy装换为矩阵,transpose将矩阵进行装置    labelMat = np.mat(classLabels).transpose()    #获取矩阵的行列m为行,n为列    m,n = np.shape(dataMatrix)    #alpha为步长    alpha = 0.001    #迭代次数    maxCycles = 500    #参数,将参数都初始化为1    weights = np.ones((n,1))    #通过迭代求解参数值    for k in range(maxCycles):        #dataMatrix*weights得到的是所有的结果,h为一个矩阵100*1        h = sigmod(dataMatrix*weights)        #error为误差        error = (labelMat - h)        #通过梯度上升来求解参数        weights = weights + alpha * dataMatrix.transpose() * error    return weightsif __name__ =="__main__":    dataMat, labelMat = loadDataSet()    weights = gradAscent(dataMat, labelMat)    print (weights)
数据集

-0.01761214.0530640-1.3956344.6625411-0.7521576.5386200-1.3223717.15285300.42336311.05467700.4067047.06733510.66739412.7414520-2.4601506.86680510.5694119.5487550-0.02663210.42774300.8504336.92033411.34718313.17550001.1768133.1670201-1.7818719.0979530-0.5666065.74900310.9316351.5895051-0.0242056.1518231-0.0364532.6909881-0.1969490.44416511.0144595.75439911.9852983.2306191-1.693453-0.5575401-0.57652511.7789220-0.346811-1.6787301-2.1244842.67247111.2179169.5970150-0.7339289.0986870-3.642001-1.61808710.3159853.52395311.4166149.6192320-0.3863233.98928610.5569218.29498411.22486311.5873600-1.347803-2.40605111.1966044.95185110.2752219.54364700.4705759.3324880-1.8895679.5426620-1.52789312.1505790-1.18524711.3093180-0.4456783.29730311.0422226.1051551-0.61878710.32098601.1520830.54846710.8285342.6760451-1.23772810.5490330-0.683565-2.16612510.2294565.9219381-0.95988511.55533600.49291110.99332400.1849928.7214880-0.35571510.3259760-0.3978228.05839700.82483913.73034301.5072785.02786610.0996716.8358391-0.34400810.71748501.7859287.7186451-0.91880111.5602170-0.3640094.7473001-0.8417224.11908310.4904261.9605391-0.0071949.07579200.35610712.44786300.34257812.2811620-0.810823-1.46601812.5307776.47680111.29668311.60755900.47548712.0400350-0.78327711.00972500.07479811.0236500-1.3374720.4683391-0.10278113.7636510-0.1473242.87484610.5183899.88703501.0153997.5718820-1.658086-0.02725511.3199442.17122812.0562165.0199811-0.8516334.3756911-1.5100476.0619920-1.076637-3.18188811.82109610.28399003.0101508.4017661-1.0994581.6882741-0.834872-1.7338691-0.8466373.84907511.40010212.62878101.7528425.46816610.0785570.05973610.089392-0.71530011.82566212.69380800.1974459.74463800.1261170.9223111-0.6797971.22053010.6779832.55666610.76134910.6938620-2.1687910.14363211.3886109.34199700.31702914.7390250
输出结果
[[ 4.12414349] [ 0.48007329] [-0.6168482 ]]



原创粉丝点击