机器学习实战学习笔记(四)Logistic回归

本文介绍了Logistic回归的概念,包括Sigmoid函数的性质及其在分类中的应用。通过梯度上升法求解最佳回归系数,详细阐述了梯度上升的原理和Logistic回归的梯度更新公式推导。同时讨论了随机梯度上升算法的优化策略,并展示了在疝气病症预测案例中的应用和效果评估。
摘要由CSDN通过智能技术生成

PS:该系列数据都可以在图灵社区(点击此链接)中随书下载中下载(如下)
在这里插入图片描述

1 基于Logistic回归和Sigmoid函数的分类

                                                      Logistic回归
	优点:计算代价不高。易于理解和实现。
	缺点:容易欠拟合,分类精度可能不高。
	适用数据类型:数值型和标称型数据。

  我们想要的函数应该是,能接受所有的输入然后预测出类别。例如在两个类的情况下,函数输出0或1,这种性质的函数称为海维赛德阶跃函数(Heaviside step function),或者直接称为单位阶跃函数。然而,海维赛德阶跃函数的问题在于:该函数在跳跃点上从0瞬间跳跃到1,这个瞬间跳跃过程有时很难处理。找一个类似性质的函数,且数学上更易处理,这就是Sigmoid函数。下面给出Sigmoid函数具体的计算公式和图像:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1
在这里插入图片描述
  由上图可知,当x为0时,Sigmoid函数值为0.5。随着x的增大,对应的Sigmoid值将逼近于1;而随着x的减小,Sigmoid值将逼近于0。因此,为了实现Logistic回归分类器,我们可以在每个特征上都乘以一个回归系数,然后把所有的结果值相加,将这个总和带入Sigmoid函数中,进而得到一个范围在0~1之间的数值。任何大于0.5的数据被分入1类,小于0.5即被归入0类。所以Logistic回归也可以被看成是一种概率估计。

2 基于最优化方法的最佳回归系数确定

  Sigmoid函数的输入记为 z z z z = w 0 x 0 + w 1 x 1 + w 2 x 2 + . . . + w n x n z = w_0x_0 + w_1x_1+w_2x_2+...+w_nx_n z=w0x0+w1x1+w2x2+...+wnxn,如果采用向量的写法,上述公式可以写成 z = w T x z=w^Tx z=wTx,他表示将这两个数值向量对应元素相乘然后全部加起来得到 z z z值。其中向量 x x x是分类器的输入数据,向量 w w w也就是我们要找到的最佳参数(系数)。

2.1 梯度上升法

  梯度上升法基于的思想是:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。如果梯度记为 ∇ \nabla ,则函数 f ( x , y ) f(x,y) f(x,y)的梯度为:
∇ f ( x , y ) = ( ∂ f ( x , y ) ∂ x ∂ f ( x , y ) ∂ y ) \nabla f(x, y)=\left(\begin{array}{l}{\frac{\partial f(x, y)}{\partial x}} \\ {\frac{\partial f(x, y)}{\partial y}}\end{array}\right) f(x,y)=(xf(x,y)yf(x,y))
  这个梯度意味着要沿 x x x的方向移动 ∂ f ( x , y ) ∂ x \frac{\partial f(x,y)}{\partial x} xf(x,y),沿 y y y的方向移动 ∂ f ( x , y ) ∂ y \frac{\partial f(x,y)}{\partial y} yf(x,y)。其中函数 f ( x , y ) f(x,y) f(x,y)必须要在待计算的点上有定义并且可微。梯度算子总是指向函数值增长最快的方向,而移动量的大小称为步长,记做 α \alpha α。用向量来表示的话,梯度算法的迭代公式为: w : = w + α ∇ w f ( w ) w:=w+\alpha\nabla_wf(w) w:=w+αwf(w)。该公式将一直被迭代执行,直到达到某个停止条件为止,比如迭代次数达到某个指定值或算法达到某个可以允许的误差范围。
  梯度下降算法与梯度上升算法时一样的,公式变为: w : = w − α ∇ w f ( w ) w:=w-\alpha\nabla_wf(w) w:=wαwf(w)前者用来求最小值,后者用来求最大值。

2.2 训练算法:使用梯度上升找到最佳参数

#伪代码:
每个回归系数初始化为1
重复R次:
	计算整个数据集的梯度
	使用alpha×gradient
	返回回归系数

  创建一个名为logRegres.py的文件,并下载数据集,将其中的testSet.txt文件复制到logRegres.py所在的文件夹,输入如下代码:

import numpy as np

def  loadDataSet():
    '''创建数据集'''
    dataMat = []; labelMat = []
    with open('testSet.txt', 'r') as fileObject:
        for line in fileObject.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):
    return 1.0 / (1 + np.exp(-inX))

def gradAscent(dataMatIn, classLabels):
    '''梯度上升'''
    #转换为NumPy矩阵数据类型
    dataMatrix = np.mat(dataMatIn)
    labelMat = np.mat(classLabels).transpose()
    m, n = np.shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    weights = np.ones((n, 1))
    for k in range(maxCycles):
        #梯度更新,定性地说是计算真实类别与预测类别的差值
        h = sigmoid(dataMatrix * weights)
        error = (labelMat - h)
        weights = weights + alpha * dataMatrix.transpose() * error
    return weights

  便利函数loadDataSet(),它的主要功能是打开文本文件testSet.txt文件并逐行读取。每行前两个值分别是X1和X2,第三个值是数据对应的类别标签,为了方便计算,该函数还将X0的值设为1.0。我们利用NumPy矩阵对数据进行处理,这里需要详细说明的是梯度更新的部分的两行更新公式。下面进入数学推导:

2.2.1 Logistic回归梯度更新公式推导

  我们记Sigmoid函数为 g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+ez1
  对Sigmoid函数求导很容易得到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值