实验五 Logistics回归

本文详细介绍了Logistics回归的概念,包括Sigmoid函数的作用和计算公式,以及其作为分类算法的优点和缺点。文章深入探讨了基于最优化方法确定最佳回归系数的梯度上升法,包括主要思想、优化算法及其在绘制决策边界中的应用。此外,还讨论了随机梯度上升和改进的随机梯度上升算法,并通过病马疝气病症预测的例子展示了Logistics回归的实际应用。
摘要由CSDN通过智能技术生成

概念

Logistics回归

逻辑回归是用来做分类算法的,大家都熟悉线性回归,一般形式是Y=aX+b,y的取值范围是[-∞, +∞],有这么多取值,怎么进行分类呢?不用担心,伟大的数学家已经为我们找到了一个方法。

也就是把Y的结果带入一个非线性变换的Sigmoid函数中,即可得到[0,1]之间取值范围的数S,S可以把它看成是一个概率值,如果我们设置概率阈值为0.5,那么S大于0.5可以看成是正样本,小于0.5看成是负样本,就可以进行分类了。

Sigmoid函数

Sigmoid函数是一种阶跃函数( step function )。在数学中,如果实数域上的某个函数可以用半开区间上的指示函数的有限次线性组合来表示,那么这个函数就是阶跃函数。而数学中指示函数(indicator function)是定义在某集合X上的函数,表示其中有哪些元素属于某一子集A。
具体计算公式为:
在这里插入图片描述
为了实现Logistic回归分类器,我们在每个特征上都乘以一个回归系数,然后把所有的结果值相加,将这个总和代人Sigmoid函数中,进而得到一个范围在0~1之间的数值。任何大于0.5的数据被分入1类,小于0.5即被归入0类。所以,Logistic回归也可以被看成是一种概率估计。

优缺点

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

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

梯度上升法

主要思想

要找到某函数的最大值,最好的方法是沿着该函数的梯度方向探寻。
在这里插入图片描述
梯度上升算法到达每个点后都会重新估计移动方向。从P0开始,计算完该点的梯度,函数就根据梯度移动到P2。如此循环知道满足停止条件。
在这里插入图片描述

Logistic回归梯度上升优化算法

下面展示一些 内联代码片

// A code block
var foo = 'bar';
# 加载数据函数
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]))            #添加标签
    fr.close()
    return dataMat,labelMat

#sigimod函数
def sigmoid(inX):
    return 1.0/(1+np.exp(-inX))

#梯度上升算法
def gradAscent(dataMatIn,classLabels):
    dataMatrix = np.mat(dataMatIn)              #转换成numpy的mat
    labelMat = np.mat(classLabels).transpose()  #转换后进行转置
    m,n = np.shape(dataMatrix)                  #返回dataMatrix的大小,m为函数,n为列数
    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.getA()

结果:
在这里插入图片描述
通过求解出的参数就可以确定不同类别数据之间的分割线,画出决策边界。

绘制决策边界

import matplotlib.pyplot as plt
import numpy as np

# 加载数据函数
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]))            #添加标签
    fr.close()
    return dataMat,labelMat

#sigimod函数
def sigmoid(inX):
    return 1.0/(1+np.exp(-inX))

# 绘制数据集的函数
def plotDataSet(weights):
    dataMat, labelMat = loadDataSet()       #加载数据集
    dataArr = np.array(dataMat)             #转换为np数组
    n = np.shape(dataMat)[0]
    xcord1 = [] ; ycord1 = []               #正样本
    xcord2 = [] ; ycord2 = []               #负样本
    for i in range(n):                      #根据数据集标签进行分类
        if int(labelMat[i]) == 1:           #1为正样本
            xcord1.append(dataArr[i,1]);ycord1.append(dataArr[i,2])
        else:                               #0为负样本
            xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
    fig = plt.figure()
    ax = fig.add_subplot(111)               #添加subplot
    #绘制正负样本
    ax.scatter(xcord1, ycord1, s = 20, c = 'red', marker='s',alpha=.5)
    ax
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值