Logistic回归、最优化理论与算法

425 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

基于Logistic回归和sigmoid函数分类

在介绍logistic回归之前,我们先要搞懂回归和分类的区别: 在这里插入图片描述

通俗一-点讲,我们要预测的结果是一个数,比如要通过- 一个人的饮食预测-一个人的体 重体重的值可以有无限多个,有的人50kg,有的人51kg在50和51之间也有无限多个数这种预测结果是某一个确定数, 而具体是哪个数有无限多种可能的问题我们会训练出-个模型传入参数后得到这个确定的数这类问题我们称为回归问题预测的这个变量(体重因为有无限多种可能在数轴上是连续的,所以我们称这种变量为连续变量 通俗一-点讲,我们要预测的结果是一个数,比如要通过-一个人的饮食预测-一个人的体重体重的值可以有无限多个,有的人50公斤,有的人51公斤在50和51之间也有无限多个数这种预测结果是某一个确定数,而具体是哪个数有无限多种可能的问题我们会训练出-个模型传入参数后得到这个确定的数这类问题我们称为回归问题预测的这个变量(体重因为有无限多种可能在数轴上是连续的,所以我们称这种变量为连续变量

我们要预则-个人身体健康或者不健康预测会得癌症或者不会得癌症,预测他是水瓶座天蜴座还是射手座这种结果只有几个值或者多个值的问题我们可以把每个值都当做-类预测对像到底属于哪- -类 这样的问题称为分类问题.如果-个分类问题的结果只有两个 比如是和不是“两个结果我们把结果为"是的样例数据称为正例" ,讲结果为"不是的样例数据称为“负例对应的,这种结果的变量称为离散型变量。 我们要预则-个人身体健康或者不健康预测会得癌症或者不会得癌症,预测他是水瓶座天蜴座还是射手座这种结果只有几个值或者多个值的问题我们可以把每个值都当做-类预测对像到底属于哪--类这样的问题称为分类问题.如果-个分类问题的结果只有两个比如是和不是“两个结果我们把结果为”是的样例数据称为正例“,讲结果为”不是的样例数据称为“负例对应的,这种结果的变量称为离散型变量.

而我们拟合的过程就称为回归。

**Logistic回归的一般过程** 
(1) 收集数据:采用任意方法收集数据。 
(2) 准备数据:由于需要进行距离计算,因此要求数据类型为数值型。另外,结构化数据
格式则最佳。 
(3) 分析数据:采用任意方法对数据进行分析。 
(4) 训练算法:大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数。 
(5) 测试算法:一旦训练步骤完成,分类将会很快。 
(6) 使用算法:首先,我们需要输入一些数据,并将其转换成对应的结构化数值;
接着,基于训练好的回归系数就可以对这些数值进行简单的回归计算,判定它们属于
哪个类别;在这之后,我们就可以在输出的类别上做一些其他分析工作。

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

极大似然估计

为了确定回归的系数,我们这里引进极大似然估计法。 下面是其定义和理论上的推导。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

最优化算法理论

我们介绍的第一个最优化算法叫做梯度上升法。梯度上升法基于的思想是:要找到某函数的 最大值,最好的方法是沿着该函数的梯度方向探寻。如果梯度记为∇,则函数f(x,y)的梯度由 下式表示: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 该公式将一直被迭代执行,直至达到某个停止条件为止,比如迭代次数达到某个指定值或算 法达到某个可以允许的误差范围。

梯度下降算法 
你最经常听到的应该是梯度下降算法,它与这里的梯度上升算法是一样的,只是公式中的
加法需要变成减法。因此,对应的公式可以写成 

在这里插入图片描述

梯度上升算法用来求函数的最大值,而梯度下降算法用来求函数的最小值。

在这里插入图片描述 在介绍完最优化理论后,我们来进行一些算法的介绍和实现

logistic回归梯度上升优化算法

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

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

导入数据集,其中dataMat为向量[1 x1 x2],1是常数项。用labelMat取出标签。

def sigmoid(inX):
    return 1.0 / (1 + np.exp(-inX))

定义sigmoid函数

def gradAscent(dataMatIn, classLabels):
    dataMatrix = np.mat(dataMatIn)             #convert to NumPy matrix
    labelMat = np.mat(classLabels).transpose() #convert to NumPy matrix
    m, n = np.shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    weights = np.ones((n, 1))
    for k in range(maxCycles):              #heavy on matrix operations
        h = sigmoid(dataMatrix*weights)     #matrix mult
        error = (labelMat - h)              #vector subtraction
        weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
    return weights

梯度上升法函数。mat函数将列表转化为矩阵dataMatrix,对classLabels转置又得到了labelMat,取定α=0.001,最大循环次数为500,并且公式里的原理进行循环计算即可。 这就是logistic回归梯度上升优化算法,因为篇幅限制,就不再介绍随机梯度上升法和和改进的随机梯度上升法了。最后附上源码和数据集供读者使用