第三章.逻辑回归—逻辑回归

news2024/12/25 14:29:13

第三章.逻辑回归

3.1 逻辑回归(Logistic Regression)

线性回归以及非线性回归是用来处理回归问题的,而逻辑回归是用来处理分类问题的。

1.应用场景:

1).分类:

  • 垃圾邮件分类
  • 预测肿瘤是良性还是恶行
  • 预测某人的信用是好是坏

2.Sigmoid / Logistic Function

1).Sigmoid/Logistic函数:

在这里插入图片描述

2).预测函数:

在这里插入图片描述

  • 将g(x)代到h0(x)中:

在这里插入图片描述

3).图像:

在这里插入图片描述

  • 图像描述:
    ①.0.5可以作为分类的边界
    ②.当z≥0时,g(z)≥0.5;当θTX≥0时,g(θTX)≥0.5
    ③.当z≤0时,g(z)≤0.5;当θTX≤0时,g(θTX)≤0.5

3.决策边界

1).

在这里插入图片描述

  • 图像描述:
    ①.线下面的点都是小于0的,属于标签为0的类别
    ②.线上面的点都是大于0的,属于标签为1的类别

2).

在这里插入图片描述

  • 图像描述:
    ①.圈内点都是小于0的,属于标签为0的类别
    ②.圈外的点都是大于0的,属于标签为1的类别

3).

在这里插入图片描述

  • 图像描述:
    ①.决策边界内的点都是小于0的,属于标签为0的类别
    ②.决策边界外的点都是大于0的,属于标签为1的类别

4.逻辑回归的代价函数

1).图像:

在这里插入图片描述

  • 说明:非凸函数在使用线性回归的代价函数的梯度下降法的时候,会存在多个局部极小值,不利于参数的求解,因此引入了逻辑回归的代价函数。

2).代价函数

在这里插入图片描述

  • 参数说明:
    ①.h0(x):预测值
    ②.y:样本标签

3).转换:

①.两个公式合并成一个公式: (深度学习中交叉熵也是这个公式)
在这里插入图片描述
②.梯度下降法求解逻辑回归:

在这里插入图片描述
③.求导的过程:
在这里插入图片描述

  • 涉及到的公式:
公式
( logax)'=1/xlna
T x) ’ = x
lne=1
log是以e为底

④.最终的公式:
在这里插入图片描述

5.多分类

在这里插入图片描述

  • 图像描述:
    ①.多分类可以做多个决策边界

6.逻辑回归正则化

1).普通逻辑回归代价函数:

在这里插入图片描述

2).正则化逻辑回归代价函数:

在这里插入图片描述

3).求导:

在这里插入图片描述

7.实战1:梯度下降法—逻辑回归:

数据标准化有利于优化梯度下降法。

1).CSV中的数据:

  • LR-testSet.csv

2).代码

import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import classification_report
from sklearn import preprocessing

# 数据是否需要标准化
scale = False

# 载入数据
data = np.genfromtxt('D:\\Data\\LR-testSet.csv', delimiter=',')

# 数据切片
x_data = data[:, :-1]
y_data = data[:, -1]


# 画图
def plot():
    x0 = []
    x1 = []
    y0 = []
    y1 = []

    # 切分不同类别的数据:区分标签0和标签1
    for i in range(len(x_data)):
        if y_data[i] == 0:
            x0.append(x_data[i, 0])
            y0.append(x_data[i, 1])
        else:
            x1.append(x_data[i, 0])
            y1.append(x_data[i, 1])

    # 画散点图
    scatter0 = plt.scatter(x0, y0, c='b', marker='o')
    scatter1 = plt.scatter(x1, y1, c='r', marker='x')

    # 图例
    plt.legend(handles=[scatter0, scatter1], labels=['label0', 'label1'], loc='best')


plot()
plt.show()

# 数据处理
# 增加维度
y_data = data[:, -1, np.newaxis]

# 给样本增加偏置项
X_data = np.concatenate((np.ones((100, 1)), x_data), axis=1)

lr = 0.001
epochs = 10000
costList = []


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


# 代价函数
def cost(xMat, yMat, ws):
    value1 = np.multiply(yMat, np.log(sigmoid(xMat * ws)))
    value2 = np.multiply(1 - yMat, np.log(1 - sigmoid(xMat * ws)))
    return np.sum(value1 + value2) / - (len(xMat))


# 梯度下降函数
def gradAscent(xArr, yArr):
    # 判断数据是否需要标准化
    if scale == True:
        xArr = preprocessing.scale(xArr)

    xMat = np.mat(xArr)
    yMat = np.mat(yArr)

    # 返回数据的行列数
    m, n = np.shape(xMat)

    # 初始化权值
    ws = np.mat(np.ones((n, 1)))

    for i in range(epochs + 1):#+1是为了记录最后一次的代价函数的值
        h = sigmoid(xMat * ws)
        # 计算误差
        # xMat使用转置的原因:xMat是[100,3],转置后[3,100],h是[100,1],ws_grad是[3,1],回归参数正好是[3,1]的
        ws_grad = xMat.T * (h - yMat) / m

        ws = ws - lr * ws_grad

        if i % 50 == 0:
            costList.append(cost(xMat, yMat, ws))

    return ws, costList


# 训练模型,得到权重和cost值得变化
ws, costList = gradAscent(X_data, y_data)

if scale == False:
    # 绘制决策边界
    plot()
    x_test = [[-4], [3]]
    #y_test公式的由来:直线方程:w0+w1*x+w2*y=0 -> y=(-w0-w1*x)/w2
    y_test = (-ws[0] - x_test * ws[1]) / ws[2]
    plt.plot(x_test, y_test, 'k')
    plt.show()

# 绘制loss值得变化
x = np.linspace(0, 10000, 201)#每50次记录一下,一共记录了201次
plt.plot(x, costList, c='r')
plt.title('Train')
plt.xlabel('Epochs')
plt.ylabel('Cost')
plt.show()


# 预测
def predict(x_data, ws):
    if scale == True:
        x_data = preprocessing.scale(x_data)

    xMat = np.mat(x_data)
    ws = np.mat(ws)
    return [1 if x >= 0.5 else 0 for x in sigmoid(xMat * ws)]


precisions = predict(X_data, ws)
print(classification_report(y_data, precisions))

3).结果展示:

①.数据

在这里插入图片描述

②.图像

在这里插入图片描述

8.实战2: sklearn—逻辑回归:

数据标准化有利于优化梯度下降法。

1).CSV中的数据:

  • LR-testSet.csv

2).代码

import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
from sklearn.metrics import classification_report

# 数据是否需要标准化
scale = False

# 载入数据
data = np.genfromtxt('D:\\Data\\LR-testSet.csv', delimiter=',')
x_data = data[:, :-1]
y_data = data[:, -1]


# 画图
def plot():
    x0 = []
    y0 = []
    x1 = []
    y1 = []
    # 切分不同类别的数据
    for i in range(len(x_data)):
        if (y_data[i] == 0):
            x0.append(x_data[i, 0])
            y0.append(x_data[i, 1])
        else:
            x1.append(x_data[i, 0])
            y1.append(x_data[i, 1])

    # 绘制散斑点
    scatter0 = plt.scatter(x0, y0, c='b', marker='o')
    scatter1 = plt.scatter(x1, y1, c='r', marker='x')

    # 绘制图例
    plt.legend(handles=[scatter0, scatter1], labels=['label0', 'label1'])


plot()
plt.show()

# 创建并拟合模型
logistic = linear_model.LogisticRegression()
logistic.fit(x_data, y_data)

# 截距
intercept = logistic.intercept_

# 回归系数
coef = logistic.coef_

if scale == False:
    # 绘制决策边界
    plot()
    x_test = np.array([[-4], [3]])
    y_test = (-intercept - x_test * coef[0][0]) / coef[0][1]
    plt.plot(x_test, y_test, 'k')
    plt.show()

# 预测值
predictions = logistic.predict(x_data)
print(classification_report(y_data, predictions))

3).结果展示:

①.数据

在这里插入图片描述

②.图像

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ITIL知识管理分析及如何实施

什么是知识管理 知识管理是在 IT 服务台内收集、分析、存储和共享知识的过程。它旨在帮助服务台团队在整个使用寿命期间做出正确的决策 通过有效控制和处理信息流来循环和事件解决过程。 ITIL 4将知识管理定义为负责向以下机构提供知识的一个中央流程 所有其他IT 服务管理 &a…

linux / Generic Netlink

一、概述 Generic Netlink 是内核专门为了扩展 netlink 协议簇而设计的“通用netlink协议簇”。由于 netlink 协议最多支持 32 个协议簇,目前 Linux4.1 的内核中已经使用其中 21 个,对于用户需要定制特殊的协议类型略显不够,而且用户还需自行…

SHELL基本知识超级详解

目录 shell基本知识 1,为什么学习和使用Shell编程 2, shell的起源 3,shell的功能 4,shell的分类 5, shell脚本的基本元素 6, shell脚本编写规范 7,shell脚本的执行方式 8, 执…

JavaScript 类的继承

通过原型链的方式继承 通过实例化一个构造函数,使字类的原型指向父类的实例,字类就可以调用到父类的属性和方法 function Parent() {this.parentName 父亲;this.getParentName function () {console.log("parent name is: %s", this.paren…

剑指 Offer 第13天 第14天

目录 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 剑指 Offer 57. 和为s的两个数字 剑指 Offer 58 - I. 翻转单词顺序 剑指 Offer 12. 矩阵中的路径 面试题13. 机器人的运动范围 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函…

maven基础-关于什么是maven、如何安装以及在Eclipse中的使用等等

本文是向大家介绍项目管理工具maven的基础使用,它能够实现项目构建打包共享,能够实现自动清理、编译、测试、报告等提高开发效率。一、为什么使用Maven这样的构建工具【why?】二、maven是什么【what?】三、安装maven四、第一个mav…

SpringCloud_02

注意: spring:application:name: userserviceprofiles:active: devcloud:nacos:server-addr: localhost:8848config:file-extension: yaml这里的name如果对应的nacos只有默认的命名空间,就直接写入服务名, 如果有其他的命名空间,…

windows 10使用Pycharm从0到1搭建一个QQ聊天机器人

文章目录选择Python环境安装nb-cli配置Go-cqhttp大工告成!选择Python环境 Nonebot2官方说,python版本要大于3.8,推荐大家使用虚拟环境,在Poetry、venv、Conda选择一个自己熟悉的即可。 安装nb-cli pip install -i https://pypi…

2-3-1-1、MySQL相关变种及体系结构

目录与MySQL有关的数据库DrizzleMariaDBPercona ServerPostgre SQLSQLiteMySQL体系结构简介连接池管理工具和服务SQL 接口解析器存储引擎、文件系统连接层Server层(SQL处理层)缓存缓存弃用的原因存储引擎层MySQL 官方引擎概要InnoDB 存储引擎MylSAM 存储…

Linux常用命令——rexec命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rexec 运程执行Linux系统下命令 补充说明 rexec命令用于在指定的远程Linux系统主机上执行命令,向远程rexec服务器发出执行命令的请求。 rexec命令通过检查$HOME/.netrc文件(包含远程主机…

安装NLTK出现11004和11006错误

出现11404的错误 原因是因为访问github的ip地址出现错误 解决方案: 打开C:->Windows->System32->drivers->etc->host, 打开host文件。 在文件最后添加185.199.108.133 raw.githubusercontent.com,即可解决 可以查看raw.githubusercont…

Sublime Text运行C和C++程序

Sublime Text 是一款当下非常流行的文本编辑器,其功能强大(提供有众多的插件)、界面简洁、还支持跨平台使用(包括 Mac OS X、Linux 和 Windows)。 在程序员眼中,Sublime Text 不仅仅是一个文本编辑器&…

文本处理以及求相似度

常规操作。先读取文档 ## 1. 分词 , 清洗关键词, # # 删除 特殊字符 # PATTERN r[?|$|&|*|%||(|)|~] # text re.sub(PATTERN, r, text)# string manipulation libs import re import string import nltk from nltk.corpus impor…

Eureka、Ribbon、Nacos之初识微服务(一)

一.微服务技术栈二.服务架构1.1单体架构1.2分布式架构1.3微服务技术对比1.4服务提供者与消费者(相对)服务提供者:暴露接口给其它微服务调用服务消费者:调用其它微服务提供的接口提供者与消费者角色其实是相对的三.Eureka注册中心1.1Eureka的作用Eureka自…

美团动态线程池实践思路,开源了

背景 「使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢?」 ❝ 1.代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适 2.凭经验设置参数值,上线后发现需要调整,改代码重启服务,…

java职工工资管理系统(GUI+无数据库)使用java制作

当年大一的课程设计,欢迎大家参考借鉴! 二、系统实现 1.登录界面 创建容器,把相应得组件设置后放入容器。如:密码、文本框、用户、按钮等组件。 设置组件位置使其更加美观(如下图)。账号:root 密码:123 2.系统界面 在查询窗口输入工号,监听模块识别并在文件内查找与工…

部署 KubeEdge 及简单使用

版本说明 k8s版本:1.22.3 kubeedge:1.10.0 kubernetes 集群准备 [roothadoop03 kubeedge]# kubectl get nodes NAME STATUS ROLES AGE VERSION hadoop03 Ready control-plane,master 9d v1.22.3cloudcore k…

电脑c盘空间不足如何清理空间,c盘清理的方法

关于电脑c盘空间不足,相信是很多人所头疼的问题吧,随着电脑使用次数的增加,那c盘的空间越来越少,一直到完全变红,电脑也变得越来越卡,那么我们要怎么去解决呢?电脑c盘空间不足如何清理空间&…

【Go】基于telegraf进行自定义插件开发(一)

基于telegraf进行插件的自定义(一)前言正文环境准备目录结构插件结构示例代码注册插件结语前言 以长期使用Prometheus和各种exporter的经验来说,大量的exporter会占用物理机的端口资源,虽说这不是特别严重的问题,但是…

【生物信息学】基于SparCC, MENA, LSA, CoNet构建微生物相互作用网络

基于SparCC, MENA, LSA, CoNet构建微生物相互作用网络背景介绍网络推断技术用于宏基因组学及其存在的问题实现方法和工具SparCCMENALSACoNetSPIEC-EASI总结参考资料背景介绍 微生物之间的共现(Co-occurrence)可能有以下几种原因,它们可能具有一定的生态关系&#x…