逻辑回归(LogisticRegression)算法及简单案例

2023-05-16

逻辑回归(LogisticRegression)算法及简单案例

大家好,我是W

逻辑回归虽然名字有回归,但是实际上是分类模型,常用于二分类。**回归的意思是:在二维空间中找到一条最佳拟合直线去拟合数据点;在多维空间中找到最佳拟合超平面去拟合数据点,这个寻找拟合的过程就叫做回归。**这篇文章的顺序是:介绍相关概念、逻辑回归原理、案例 - 简单数据集的逻辑回归分类

介绍相关概念

二值型输出分类函数

在我们通过回归得到一个数值时我们需要一个函数给我们做分类,在数学上我们就学过一个分段函数,x>0时,f(x)=1,x<0时,f(x)=0。这就是典型的跳跃函数也叫阶跃函数。

在这里插入图片描述

但是这种函数在从0到1跳跃的瞬间过程不好处理,它不是连续的,所以有缺陷。但是有些函数就有很不错的性质,比如sigmoid、tanh、relu。就拿最常见的sigmoid函数来说,他的方程是:

在这里插入图片描述

其图像是:

在这里插入图片描述

当x=0时,f(x)=0.5,函数在x=0两侧逐渐收敛向0和1两个极端,并且函数单增。有了sigmoid函数,我们无论输入什么值都可以得到(0,1)的数值,然后通过0.5为界分类。

梯度下降法

在高数中我们都学过偏导,而偏导的结果就是梯度。梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

f(x,y)有两个自变量,其梯度就有x和y两个方向。f分别对x和y求偏导就能得到该函数在该方向上的梯度。

在这里插入图片描述

下面用一个二维坐标系来讲解一下梯度下降法的思想,在二维坐标中有一条sin曲线,变量x在曲线上移动,试图寻找最大值,按照梯度下降(上升)法的思想,只要知道梯度的下降(上升)的方向就能知道x点在sin曲线上移动的方向。

在这里插入图片描述

在上图中,x作为变量,y作为我们的目标值,这样方便理解,在实际运用中变量可能由n个,这时我们就需要在不同维度去求梯度从而使得粒子在不同维度都逼近我们想要的最大(最小)值。**当我们寻找最高点时,使用梯度上升法。假设x=1,在改点对函数求导,得到的是正数,故x应当向正方向移动;当x=2时,得到的是负数,证明在改点继续移动f(x)会越来越小,这与我们预期相违背,所以应当向负方向移动。**梯度下降也是同样的道理。

学习率

粒子(样本点)的移动有一个重要的参数学习率。学习率通常用alpha来表示,即我们每次移动的步长。想想一下,在上图中若步长太大粒子一下在1一下在2的反复横跳,始终无法逼近最高值,那么经过一定次数的训练后停止。显然得到的精度还是无法满足我们要求的,所以学习率一般会很小,但是过分小也会带来训练时间的问题。

拓展到3维空间,在一座山上有x,y,z(x,y),那么分为两个维度x,y来求梯度,粒子分别在x,y上移动两次(相当于画矩形两条边)然后达到下一个位置,这个位置往往会比上一个位置好。

若大家对梯度下降和学习率还有疑问请看梯度下降算法详解,讲不好真的是不好意思=。=

向量相乘、矩阵乘法

在代数中我们学过向量和矩阵的乘法,例如[2,3] * [3,1] = [2,1],2*3的矩阵跟3*1的矩阵相乘得到2*1的矩阵。

矩阵向量相乘本质上就是解方程组,

逻辑回归原理

在了解上面几个概念后把他们串联起来就能理解逻辑回归原理。首先逻辑回归的公式是:

y = w_1*x_1 + w_2*x_2 + ... + w_n*x_n +bias    ---(1)
bias为偏置,可以理解为一元函数的y=ax+b中的b
  • 由于我们有样本,所以x向量([x_1,x_2,…,x_n])已知,我们要做的是调整weights向量([w_1,w_2,…,w_n])使之能够拟合绝大部分样本。
  • 而sigmoid的作用是将每次调整后计算得到的y_predict送入sigmoid做分类从而拿到我们对每个样本的预测标签label_predict。
  • 当然,label_predict跟label_true还是有差别的,label_predict可能会预测错,所以要从新带入(1)式中计算y_predict,重新送入sigmoid…如此反复。

下面这张流程图可能更清楚点:

在这里插入图片描述

案例 - 简单数据集的逻辑回归分类

先看数据集

0.089392	-0.715300	1
1.825662	12.693808	0
0.197445	9.744638	0
0.126117	0.922311	1
-0.679797	1.220530	1
0.677983	2.556666	1
0.761349	10.693862	0
-2.168791	0.143632	1
1.388610	9.341997	0
0.317029	14.739025	0

这个数据集很小,只有十条。第一第二列分别代表x_1,x_2,第三列代表label。数据存在txt文档里,所以显然第一步要加载数据,用合适的数据结构存放。

数据集加载

def load_data_set(file_path):
    """
    加载dataset文件夹中的数据集
    :param file_path: 文件目录
    :return:
    """
    data_matrix = []
    label_list = []
    with open(file_path, "r") as file:
        for line in file:
            line = line.strip().split()
            data_matrix.append([float(line[0]), float(line[1]), 1.0])
            label_list.append(int(line[2]))
    return np.array(data_matrix), np.array(label_list)

sigmoid函数

sigmoid函数非常简单,而且在了解将要传入的数据结构后依然很好写,所以先准备好。

def sigmoid(values):
    """
    sigmoid函数
    :param values: 列表类型 分别计算出值封装成列表返回
    :return: 1.0 / (1.0 + np.exp(-values))
    """
    return 1.0 / (1.0 + np.exp(-values))

梯度上升训练

按照刚刚的流程图可以看到,我们需要初始化weights,然后把矩阵转为合适的形状,然后写循环训练。

而循环的内容无非就是计算y_predict,丢入sigmoid分类,计算偏差,调整weights。在经过训练后返回最终weights。

def gradAscent(data_matrix, label_matrix, alpha=0.001, n=500):
    """
    开始使用梯度上升训练weights
    :param data_matrix: np.array()类型 数据集矩阵
    :param label_matrix: np.array()类型 标签矩阵
    :param alpha: 学习率
    :param n: 训练次数
    :return: weights
    """
    # label_matrix转为列向量
    label_matrix = np.mat(label_matrix).transpose()
    # 初始化weights = [3,1] = 1
    weights = np.ones(shape=(len(data_matrix[0]), 1))
    for i in range(n):
        # [n,1] = [n,m] * [m,1] 矩阵乘法
        # 要把data_matrix从np.array 转为np.mat才能相乘
        values = np.mat(data_matrix) * weights
        # 激活函数后得到类别
        activated_values = sigmoid(values)
        # 计算误差 (以2元函数举例)
        error_list = label_matrix - activated_values
        print(activated_values,error_list)
        # 调整权重weights
        # 因为偏移量error_list是(5,1)所以要把data_matrix转为(3,5),最终得到每个权重需要调整的量
        weights = weights + alpha * data_matrix.transpose() * error_list
    return np.array(weights)

画图

为了更直观地看到点的分布和拟合直线,我们需要用matplotlib画出来。并且大家可以在上面遍历里逐条画出来,看看直线拟合的过程和走向。

def paint(data_matrix, label_matrix, weights):
    """
    画出数据集和拟合直线
    :param data_matrix:
    :param label_matrix:
    :param weights:
    :return:
    """
    point_0 = []
    point_1 = []

    plt.figure(figsize=(5, 5), dpi=200)
    # 遍历把两类点分离出来
    for i in range(len(label_matrix)):
        if label_matrix[i] == 1:
            point_1.append(data_matrix[i])
        else:
            point_0.append(data_matrix[i])
    point_0 = np.array(point_0)
    point_1 = np.array(point_1)
    # 把离散点画出来
    plt.scatter(x=point_0[:, 0], y=point_0[:, 1], c="red")
    plt.scatter(x=point_1[:, 0], y=point_1[:, 1], c="blue")

    # 画拟合曲线
    x = np.arange(-3.0, 3.0, 0.1)
    y = (-weights[2] - weights[0] * x) / weights[1]
    plt.plot(x, y)

    plt.show()

拟合对比

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

项目地址

点击进入github

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逻辑回归(LogisticRegression)算法及简单案例 的相关文章

  • wsl 镜像迁移

    wsl 镜像迁移 1 打开CMD xff0c 查看所有WSL wsl l all v NAME STATE VERSION Ubuntu 20 04 Stopped 2 centos Running 2 2 导出WSL wsl export
  • Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (一) 环境搭建

    Note 开启模块支持 xff0c 设置国内高速代理 xff0c 参考 https www jianshu com p d782d70b3a25 简介 搭建的目的只是刚好看到有这么一个模块 xff0c 还有给使用Go的人需要用到调试界面的时
  • Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (二) UI继承

    简介 在UI A 中嵌套UI B UI B 是前面搭建的一个UI控件 创建 UI 文件 创建UI TextWidget ObjectName TextWidget 文件名保存为 textwidget ui 拖了一个QTextWidget到创
  • Golang中使用Qt库(therecipe/qt)+QtDesigner + Goland (三) 信号 和 槽

    简述 如下图所示 xff0c 每个控件的信号对应都有一个Connect函数 例如Clicked信号就有一个ConnectClicked 示例 基于 Golang中使用Qt库 therecipe qt 43 QtDesigner 43 Gol
  • linux工作中软件运行安装常见问题

    本文主要内容是使用linux软件安装 以及运行时常出现的一些问题 xff0c 主要如下 xff1a sudo apt get update Unable to fetch some archives问题 soure 的区别export LD
  • Ubuntu OpenCV VideoCapture无法获取到摄像头图像

    现在做摄像头捕获视频实验 xff0c 使用ViedeCapture xff0c 出现如下错误 xff1a WARN 0 global home xgl opencv 4 3 0 modules videoio src cap v4l cpp
  • 字符串排序-C语言

    二 字符串排序 题目描述 输入一个长度不超过20的字符串 xff0c 对所输入的字符串 xff0c 按照ASCII码的大小从小到大进行排序 xff0c 请输出排序后的结果 输入描述 一个字符串 xff0c 其长度n lt 61 20 输出描
  • Unable to locate package sysv-rc-conf

    报错如下 xff1a 解决办法 xff0c 如下 xff1a 第一步 xff1a 在root权限下操作 xff0c 软件源列表sources list xff08 该文本的位置在vim etc apt sources list xff09
  • Gson使用方法

    一 概述 Gson是google提供的用来操作json数据的一个非常好用的类库 其使用范围非常的广泛 xff0c 所以非常有必要对其进行系统的学习 json是一种数据格式 xff0c 确切的说是一种文本数据格式 其在网络通讯过程中的作用非常
  • Centos7 安装jdk8

    使用rpm方式安装 1 jdk下载地址 xff1a https www oracle com java technologies downloads java8 2 安装 检测当前系统是否存在java环境 xff01 java versio
  • Nginx的https配置

    Nginx的https配置 参考地址 xff08 阿里云提交的教程链接 xff09 xff1a https help aliyun com document detail 212905 html spm 61 5176 b657008 he
  • Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException:

    Failed to parse multipart servlet request nested exception is java lang IllegalStateException The multi part request con
  • php7 mongodb 使用(二)原生驱动 增删改查和统计

    php7安装mongodb的扩展 宝塔面板环境下php7 3默认安装了pecl扩展包 xff0c 安装的php7 4版本是默认不带pecl扩展包的 需要手动安装 php版本 lt 7的时候 yum install php pear 就可以
  • 图论——spfa算法判断负权回路

    在最短路径模板 spfa算法中的模板只适用于不存在负权回路的图 xff0c 否则就会死循环 接下来做一下改动 xff0c 实现通过spfa算法判断是否存在负环 求负环的常用方法 xff0c 基于SPFA xff1a 统计每个点入队的次数 x
  • Python中的pip怎么配置环境变量

    https blog csdn net hanhanwanghaha宝藏女孩 欢迎您的关注 xff01 欢迎关注微信公众号 xff1a 宝藏女孩的成长日记 如有转载 xff0c 请注明出处 xff08 如不注明 xff0c 盗者必究 xff
  • 【Linux Posix】(19)网络编程II - 网络编程基础;网络编程主要函数

    目录 1 字节序列转换 1 1 字节序列转换概述 1 2 字节序列转换的函数 1 3 地址格式转换 2 网络编程基础 2 1 socket概述 2 2 套接字的三种类型 1 字节序列转换 1 1 字节序列转换概述 实验结论 xff1a 这台
  • Debian squid配置

    Basic squid conf etc squid3 squid conf instead of the super bloated default config file auth param basic program usr lib
  • Linux安装mysql以及遇到的问题解决办法

    话不多说 xff0c 直接开干 xff1a 1 mysql下载地址 xff08 这里使用的是5 7 28 xff09 官网地址 xff1a https dev mysql com downloads mysql 百度云地址 xff1a ht
  • kali-linux的搭建

    vmware kali的搭建 使用vmware搭建kali需要有kali的官方镜像 xff0c 这里给出镜像的下载地址 https mirrors tuna tsinghua edu cn kali images kali 2022 3 k
  • C++学习(一三零)规范路径canonical paths

    每个文件都只有一个规范路径 xff0c 可以有多个绝对路径和相对路径 绝对路径与系统相关 如果路径中别名 快捷方式 符号链接等内容 xff0c 规范路径都会将他们解析到实际的文件路径下

随机推荐

  • 树莓派4B外接电视机没反应的问题的解决

    解决办法 xff0c 修改文件 boot config txt
  • 宇宙射线 c++ || DFS

    题目 一个射线 xff0c 初始方向向上 一段时间后会分裂 xff0c 向该方向的左右45度分裂2条射线 宇宙射线会分裂那次 xff0c 每次会前进ai个单位长度 输入描述 第一行一个正整数 n n lt 61 30 表示分裂n次 第二行包
  • DDL 的恐惧 || 贪心

    题目 ZJM 有 n 个作业 xff0c 每个作业都有自己的 DDL xff0c 如果 ZJM 没有在 DDL 前做完这个作业 xff0c 那么老师会扣掉这个作业的全部平时分 所以 ZJM 想知道如何安排做作业的顺序 xff0c 才能尽可能
  • TT's Magic Cat -- 差分

    题意 TT 有一只猫 xff0c 它从 世界地图 选了 n 个城市 xff0c 用 ai 表示每个城市的资产 猫会给出几个操作 xff0c 区间 l r 的城市资产都加 c 在q次操作后 xff0c 输出所有城市的资产 Input 第一行有
  • 平衡字符串 c++ || 尺取法

    题目 一个长度为 n 的字符串 s xff0c 其中仅包含 Q W E R 四种字符 如果四种字符在字符串中出现次数均为 n 4 xff0c 则其为一个平衡字符串 现可以将 s 中连续的一段子串替换成相同长度的只包含那四个字符的任意字符串
  • 掌握魔法の东东 II Gym-270437

    题目 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c 记为a xff0c 范围区间是 0 到 A 1 xff09 和
  • week 13 程序设计 必做题

    A TT 的神秘任务1 xff08 必做 xff09 Example Input span class token number 8 span span class token number 10 span span class token
  • VS2019配置wxWidgets v3.1.5开发环境

    编译wxWidgets库 如果只是使用wxWidgets DLL库可以省略编译这一步 xff0c 直接下载编译好的库 http wxwidgets org downloads 点击 34 Download Windows Binarires
  • 「LOJ#10015」「一本通 1.2 练习 2」扩散(并查集

    题目描述 一个点每过一个单位时间就会向 444 个方向扩散一个距离 xff0c 如图所示 xff1a 两个点 a b 连通 xff0c 记作 e a b xff0c 当且仅当 a b的扩散区域有公共部分 连通块的定义是块内的任意两个点 u
  • haproxy使用技术及配置详解

    以下内容来源于网络 xff0c 感谢原作者 性能 HAProxy借助于OS上几种常见的技术来实现性能的最大化 单进程 事件驱动模型显著降低了上下文切换的开销及内存占用 O 1 事件检查器 event checker 允许其在高并发连接中对任
  • Edge浏览器,找不到本地书签或收藏夹更新时丢失了,我该怎样找回?

    1 不要着急 xff0c 可以通过以下目录找回 Edge浏览器的书签 xff0c 保存地址 xff0c 在最新版本必然保存在以下位置 xff1a C Users 用户名 AppData Local Packages Microsoft Mi
  • ubuntu系统实现远程控制

    今天在做实验的时候发现用视觉模拟激光竟然用之前的远程启动不了节点 xff08 之前是用工作站连接turtlebot上面的TK1的 xff09 xff0c 然后最后还是用了俩台电脑进行远程控制 xff0c 用到了一点小配置 xff0c 在这里
  • C++11多线程并发中的std::thread、std::mutex和std::future

    C 43 43 11 新标准中引入了五个头文件来支持多线程编程 xff1a lt atomic gt lt thread gt lt mutex gt lt condition variable gt 和 lt future gt lt a
  • 银河麒麟操作系统以root用户登录的方法

    默认情况下 xff0c 银河麒麟V10操作系统不允许root用户登录 xff0c 也不告诉你密码是什么 xff0c 但是如果需要root用户登录的时候 xff0c 可以使用命令 xff1a su 输入密码后 xff0c 就能进入root用户
  • 安装卸载EMBY,jellyfin

    这是个回忆记录 xff0c 怕时间久了忘记了 xff0c 记录可能不太全 环境是 xff1a UNAS xff0c debian xff0c 1 安装emby xff0c 去官网下载emby deb 用命名安装 安装后访问正常 卸载就麻烦了
  • centos8 OPEN LDAP部署

    英文安装文档 比较清晰 xff0c 不过为了以防万一还是记录一下 1 安装 openldap openldap servers root 64 yl08 tools yum install openldap openldap servers
  • [CentOS入门](一)Linux基础

    登陆系统方式 xff1a 文本登陆图形登陆远程登陆 终端的使用方式 xff1a centos有5个虚拟文本终端 xff0c 1个图形终端 tty 命令查看当前虚拟终端 系统支持多用户 xff08 包括使用相同用户 xff09 同时登录系统
  • [Linux]LVM (Linux 逻辑卷管理)

    概念 xff1a LVM是 Logical Volume Manager xff08 逻辑卷管理 xff09 的简写 xff0c 它是Linux环境下对磁盘分区进行管理的一种机制 PV xff1a 硬盘和分区都可以标记为PV xff0c P
  • [CentOS入门](二)Linux Bash

    Bash命令 xff1a Shell是用户与操作系统交互的入口 xff0c Bash是最常用的Linux Shell Bash命令格式 xff1a 命令 选项 参数 中间用空格分隔 命令选项参数ls lh var 如果参数中包含空格则需要在
  • 逻辑回归(LogisticRegression)算法及简单案例

    逻辑回归 LogisticRegression 算法及简单案例 大家好 xff0c 我是W 逻辑回归虽然名字有回归 xff0c 但是实际上是分类模型 xff0c 常用于二分类 回归的意思是 xff1a 在二维空间中找到一条最佳拟合直线去拟合