Logistic回归

本文详细介绍了Logistic回归,从概念到实战,包括sigmoid函数在分类中的作用,最优回归系数的梯度上升算法,以及在疝气病症预测病马死亡率中的应用。此外,还展示了如何使用sklearn构建Logistic回归分类器。

一、Logistic概述

我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归。利用logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。这里的“回归” 一词源于最佳拟合,表示要找到最佳拟合参数集。
logistic回归的一般过程
(1)收集数据:采用任意方法收集数据。
(2)准备数据:由于需要进行距离计算,因此要求数据类型为数值型。另外,结构化数据格式则最佳。
(3)分析数据:采用任意方法对数据进行分析。
(4)训练算法:大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数。
(5)测试算法:一旦训练步驟完成,分类将会很快。
(6)使用算法:首先,我们需要输入一些数据,并将其转换成对应的结构化数值;接着,基于训练好的回归系数就可以对这些数值进行简单的回归计算,判定它们属于哪个类别.,在这之后,我们就可以夺输出的类别上做一些其他分析工作。

二、Logistic回归算法

1、Logistic回归和sigmoid函数的分类

假设现在有一些数据点,我们利用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作为回归。
Logistic回归一种二分类算法,它利用的是Sigmoid函数阈值在[0,1]这个特性。Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类。其实,Logistic本质上是一个基于条件概率的判别模型。
下面我们看一下sigmoid函数,
在这里插入图片描述
在这里插入图片描述
sigmoid值域为[0,1],为了实现logistic回归分类,在每个特征上都乘以一个回归系数,然后把所有值相加,将这个总和带入到sigmoid函数中,进而得到一个范围在0-1之间的数值。任何大于0.5的数据被分入到1类,小于0.5的数据即被分入到0类。

2、最优回归系数确定:梯度上升算法

sigmoid的输入记为z,由下面的公式得出:
在这里插入图片描述
表示将这两个数值向量对应元素相乘然后全部加起来得到z值。其中x是分类器的输入数据,x的系数就是我们要找的最佳参数,接下来运用梯度上升算法求得数据集的最佳参数。
梯度上升法
基本思想:要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。
下面利用梯度上升算法找到最佳回归系数。数据包含两个数值型特征:X1和X2。
数据:testSe.txt
代码:

from numpy import *
def loaddataset():
    dataMat = [] ;  classlabel = []   #  建立数据和分类列表
    fr = open('testSet.txt').readlines()     #打开数据集,按行读取
    #  遍历数据,存放到dataMat和classlabel
    for line in fr:
        lineArr = line.strip().split()
        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])   # 方便计算,将X0的值设为1.0
        classlabel.append(float(lineArr[2]))
    return dataMat,classlabel
#  sigmid函数
def sigmoid(x):
    y = 1.0/(1+exp(-x))
    return y
def gradAscent(dataMat,classlabel):
    dataMatrix = mat(dataMat)           #  转化为矩阵,方便后面计算
    labelMatrix = mat(classlabel).transpose()
    m,n = shape(dataMatrix)           #dataMatrix行列数
    alpha = 0.001   #设置步长
    maxCycles = 500    #  迭代次数
    weights = ones((n,1))
    for k in range(maxCycles):    #   不断更新系数weights
        h = sigmoid(dataMatrix * weights)
        error = labelMatrix - h     #计算类别数值与预测的误差
        weights = weights + alpha * dataMatrix.transpose() *error  #更新参数
    return weights

dataMat,classlabel = loaddataset()
weights = gradAscent(dataMat,classlabel)
print(weights)

系数weights结果如下:
在这里插入图片描述
上面已经解出了一组回归系数,它确立了不同类别数据之间的分割线,画出决策边界使其更加形象。
代码:

from numpy import *
import matplotlib.pyplot as plt

def loaddataset():
    dataMat = [] ;  classlabel = []   #  建立数据和分类列表
    fr = open('testSet.txt').readlines()     #打开数据集,按行读取
    #  遍历数据,存放到dataMat和classlabel
    for line in fr:
        lineArr = line.strip().split()
        dataMat.append([1.0,float(lineArr[0]),
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值