监督学习之逻辑回归

逻辑回归(Logistic Regression)

逻辑回归是一种用于二分类(binary classification)问题的统计模型。尽管其名称中有“回归”二字,但逻辑回归实际上用于分类任务。它的核心思想是通过将线性回归的输出映射到一个概率值,以进行类别预测。

1. 模型概述

逻辑回归的基本公式为:

P ( y = 1 ∣ x ) = σ ( z ) = 1 1 + e − z P(y=1|x) = \sigma(z) = \frac{1}{1 + e^{-z}} P(y=1∣x)=σ(z)=1+ez1

其中:

  • ( P ( y = 1 ∣ x P(y=1|x P(y=1∣x) ) 是给定特征 ( x x x ) 时,因变量 ( y y y ) 等于 1 的概率。
  • ( z = β 0 z = \beta_0 z=β0 + β 1 x 1 \beta_1x_1 β1x1 + β 2 x 2 \beta_2 x_2 β2x2 + … \ldots + β n x n \beta_n x_n βnxn ) 是线性组合。
  • ( σ ( z ) \sigma(z) σ(z) ) 是 sigmoid 函数,将输出值映射到 0 0 0 1 1 1之间。
2. Sigmoid 函数

Sigmoid 函数的形状如下:

σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1

  • 当 ( z z z ) 为负时,函数输出接近于 0 0 0;当 ( z z z ) 为正时,函数输出接近于 1 1 1
  • 这种特性使得 sigmoid 函数非常适合用于概率预测。
3. 损失函数

逻辑回归的损失函数为交叉熵损失(cross-entropy loss),用于衡量模型预测与实际标签之间的差异。其公式为:

L ( β ) = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] L(\beta) = -\frac{1}{N} \sum_{i=1}^{N} [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)] L(β)=N1i=1N[yilog(y^i)+(1yi)log(1y^i)]

其中:

  • ( N N N ) 是样本数量。
  • ( y i y_i yi ) 是实际标签。
  • ( y ^ i \hat{y}_i y^i ) 是预测概率。

逻辑回归的损失函数求解通常通过 最大似然估计梯度下降 等优化算法进行。逻辑回归模型中常用的损失函数是 交叉熵损失,目标是通过最小化损失函数来找到最佳的模型参数。

1. 逻辑回归中的损失函数

(1)损失函数

逻辑回归的损失函数基于交叉熵(Cross-Entropy Loss),用于衡量模型预测的概率分布与实际标签之间的差异。对于二分类问题,其形式为:

L ( β ) = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] L(\beta) = - \frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] L(β)=N1i=1N[yilog(y^i)+(1yi)log(1y^i)]

其中:

  • ( N N N ) 是样本数量。
  • ( y i y_i yi ) 是第 ( i i i ) 个样本的真实标签( 0 0 0 1 1 1)。
  • ( y ^ i = σ ( z i ) \hat{y}_i = \sigma(z_i) y^i=σ(zi) ) 是第 ( i i i ) 个样本的预测概率。
  • ( z i = β 0 + β 1 x i 1 + β 2 x i 2 + ⋯ + β n x i n z_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \dots + \beta_n x_{in} zi=β0+β1xi1+β2xi2++βnxin ) 是线性组合。
  • ( σ ( z ) \sigma(z) σ(z) ) 是 sigmoid 函数,定义为:
    σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1
    这将线性回归的输出 ( z z z ) 映射到 ( ( 0 0 0, 1 1 1) ) 之间,作为类别为 1 1 1 的预测概率。
(2)如何求解损失函数

求解逻辑回归的损失函数通常使用 梯度下降 等优化方法。目标是找到使损失函数最小的参数 ( β \beta β ),即 最小化交叉熵损失。求解过程可以概括为以下步骤:

** 计算梯度**

为了最小化损失函数,我们需要对每个参数 ( β j \beta_j βj) 计算损失函数的偏导数(即梯度),并通过优化算法(如梯度下降)进行更新。

对于交叉熵损失函数,梯度计算公式为:

∂ L ∂ β j = − 1 N ∑ i = 1 N ( y i − y ^ i ) x i j \frac{\partial L}{\partial \beta_j} = -\frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i) x_{ij} βjL=N1i=1N(yiy^i)xij
其中:

  • ( x i j x_{ij} xij ) 是第 ( i i i ) 个样本的第 ( j j j ) 个特征。
  • ( y i y_i yi ) 是第 ( i i i ) 个样本的实际标签。
  • ( y ^ i \hat{y}_i y^i) 是第 ( i i i ) 个样本的预测概率。

使用梯度下降更新参数梯度下降法通过以下公式迭代更新参数:

β j = β j − α ∂ L ∂ β j \beta_j = \beta_j - \alpha \frac{\partial L}{\partial \beta_j} βj=βjαβjL

其中:

  • ( α \alpha α ) 是学习率(控制每次更新步长的大小)。
  • ( ∂ L ∂ β j \frac{\partial L}{\partial \beta_j} βjL ) 是损失函数对参数 ( β j \beta_j βj ) 的梯度。

通过不断更新参数,使得损失函数逐渐减小,直到达到全局或局部最优解。

(3) 代码示例:逻辑回归中的梯度下降

以下是使用 Python 实现逻辑回归梯度下降的示例:

import numpy as np# Sigmoid 函数
def sigmoid(z):return 1 / (1 + np.exp(-z))# 损失函数 (交叉熵)
def compute_loss(y, y_pred):return -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))# 梯度下降算法
def gradient_descent(X, y, learning_rate=0.1, num_iterations=1000):m, n = X.shapebeta = np.zeros(n)  # 初始化参数for i in range(num_iterations):z = np.dot(X, beta)y_pred = sigmoid(z)gradients = np.dot(X.T, (y_pred - y)) / mbeta -= learning_rate * gradientsif i % 100 == 0:loss = compute_loss(y, y_pred)print(f"Iteration {i}: Loss = {loss}")return beta# 示例数据
X = np.array([[1, 2], [1, 3], [2, 2], [2, 3]])  # 样本数据
y = np.array([0, 0, 1, 1])  # 标签数据# 在样本数据前面加一列 1 用于偏置项 (截距项)
X_bias = np.c_[np.ones(X.shape[0]), X]# 运行梯度下降求解参数
beta = gradient_descent(X_bias, y)
print("求解得到的参数:", beta)
4. 优缺点

优点

  • 简单易懂:逻辑回归模型简单,易于实现和解释。
  • 概率输出:模型输出的是预测的概率,可以用于更细致的决策。
  • 适用于线性可分问题:在特征与目标变量之间存在线性关系时,表现良好。

缺点

  • 线性假设:假设特征与目标之间存在线性关系,不适用于复杂的非线性关系。辑回归假设特征和类别之间的关系是线性的,对于复杂非线性问题,表现不如其他模型(如决策树、神经网络)。
  • 受特征选择影响:模型对输入特征敏感,需要合适的特征选择和处理。
  • 容易过拟合:在特征数量较多时,可能会发生过拟合,特别是当样本量不足时。
  • 无法解决多分类问题:标准的逻辑回归只适用于二分类问题,若要应用于多分类问题,需要使用 Softmax 回归或一对多策略。

5. 代码示例

以下是使用 Python 的 scikit-learn 库实现逻辑回归的示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 生成示例数据
X, y = make_classification(n_samples=100, n_features=2, n_classes=2, n_informative=2, n_redundant=0, random_state=42)# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)# 进行预测
y_pred = model.predict(X_test)# 评估模型
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
class_report = classification_report(y_test, y_pred)print("准确率:", accuracy)
print("混淆矩阵:\n", conf_matrix)
print("分类报告:\n", class_report)# 绘制决策边界
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolors='k')
xlim = plt.gca().get_xlim()
ylim = plt.gca().get_ylim()xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 100), np.linspace(ylim[0], ylim[1], 100))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')
plt.title('逻辑回归决策边界')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.show()

结果
在这里插入图片描述

在这里插入图片描述

6. 总结

逻辑回归是一种简单而有效的分类模型,适合于解决二分类问题。尽管它有一些局限性(如线性假设),但在许多实际应用中,逻辑回归因其易于解释和实现而被广泛使用。通过合适的特征选择和数据处理,逻辑回归能够在很多情况下提供可靠的分类结果。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB源码-第193期】基于matlab的网络覆盖率NOA优化算法仿真对比VFINOA,VFPSO,VFNGO,VFWOA等算法。

操作环境: MATLAB 2022a 1、算法描述 NOA(Network Optimization Algorithm,网络优化算法)是一个针对网络覆盖率优化的算法,它主要通过优化网络中节点的分布和配置来提高网络的整体覆盖性能。网络覆盖率是衡量一个无…

基于STM32G0的USB PD协议学习(3)

0、前言 STM32这个平台资源确实很不错,但是里面的PD代码是一个lib库文件,没有开源。可以做来玩玩,但是如果要满足USB-IF认证需求的话,谨慎!!! 这段时间较为繁忙,断更有点严重... …

植物健康,Spring Boot来保障

5系统详细实现 5.1 系统首页 植物健康系统需要登录才可以看到首页。具体界面的展示如图5.1所示。 图5.1 系统首页界面 5.2 咨询专家 可以在咨询专家栏目发布消息。具体界面如图5.2所示。 图5.2 咨询专家界面 5.3 普通植物检查登记 普通员工可以对普通植物检查登记信息进行添…

Linux之权限(2)

权限(2) 操作:有VS没有 只有文件的拥有者或者root,能修改自己的权限 Linux下能执行真的是一个可执行文件可执行权限 user,group,other和我自己进行身份对比,依次只对比一次 8进制数值表示方法 chmod ax /home/abc.…

基于vue、VantUI、django的程序设计

首先构建vue项目,构建项目点这里 安装 npm install axios axios简介 Axios 是一个基于 promise 的 HTTP 库,用于发起请求和接收响应,实现异步操作 基本使用 axios对象 请求响应拦截 在utils文件夹里新建ajax.js 创建一个axios对象并…

云智慧完成华为原生鸿蒙系统的适配, 透视宝 APM 为用户体验保驾护航

2024 年 10 月 22 日,首个国产移动操作系统 —— 华为原生鸿蒙操作系统 HarmonyOS NEXT 正式面世,成为继 iOS 和 Android 后的全球第三大移动操作系统。HarmonyOS NEXT,从系统内核、数据库根基,到编程语言创新、AI(人工…

【WebGis开发 - Cesium】三维可视化项目教程---图层管理拓展图层透明度控制

目录 引言一、为什么要开发图层透明度控制功能二、开发思路整理1. cesium图层api查询1.1 imageryLayer 透明度1.2 primitive 透明度 三、代码编写1. 修改原有图层管理代码2. 新增页面结构3. 编写图层透明度控制方法 四、总结 引言 本教程主要是围绕Cesium这一开源三维框架开展的…

如何通过sip信令以及抓包文件分析媒体发到哪个地方

前言 问题描述:A的媒体没转发到B,B只能听到回铃音,没有A的说话声音,并且fs这边按正常的信令发送了. 分析流程 分析早期媒体发送到哪一个IP 10.19.0.1发送了一个请求给10.19.0.157这个IP,然而这里的SDP媒体地址&am…

react 总结+复习+应用加深

文章目录 一、React生命周期1. 挂载阶段(Mounting)补充2. 更新阶段(Updating)补充 static getDerivedStateFromProps 更新阶段应用补充 getSnapshotBeforeUpdate3. 卸载阶段(Unmounting) 二、React组件间的…

搭建 mongodb 副本集,很详细

搭建 mongodb 副本集,很详细 一、前言二、创建用户1、创建 root 用户2、创建测试用户3、修改用户密码 三、修改配置文件(主节点)1、开启登录认证2、加上副本集3、最终配置文件 四、副本节点1、创建副本节点目录2、编辑配置文件3、启动副本节点…

2024年四川省大学生程序设计竞赛 补题记录

文章目录 Problem A. 逆序对染色(思维树状数组)Problem B. 连接召唤(贪心)Problem E. L 型覆盖检查器(模拟)Problem F. 小球进洞:平面版(几何)Problem G. 函数查询Proble…

关于传输线电感

要理解自感、互感、回路电感,PCB表层单位长度电感约为7.5纳亨每英寸,内层约为9纳亨每英寸 磁力线 电流周围会产生磁场,可以认为磁场是由许多“力线”构成。 电流穿过与其垂直的某一平面时,在该平面内激起一个“磁漩涡” 形成许多…

JavaSet集合

无序(指的是添加顺序和获取出的数据顺序不一致,不重复,无索引 既然Set没有索引,因此功能同上一篇Connection的功能,几乎没有额外的功能 HashSet的原理 为什么是无序(要构建红黑树)&#xff0…

【Linux学习】(9)调试器gdb

前言 Linux基础工具:安装软件我们用的是yum,写代码用的是vim,编译代码用gcc/g,调试代码用gdb,自动化构建用make/Makefile,多人协作上传代码到远端用的是git。 在前面我们把yum、vim、gcc、make、git都已经学…

逆向工程基本概念

引言 逆向工程(Reverse Engineering)是指从已经存在的产品或系统中提取信息,并理解其设计原理的过程。在软件开发中,逆向工程通常用于理解一个已有软件系统的内部工作原理,可能是为了兼容性、安全分析、修复或者改进等…

Pyhton自动化测试持续集成和Jenkins

持续集成 官方术语: 持续集成(Continuous Integration),也就是我们经常说的 CI 持续集成(CI)是一种实践,可以让团队在持续的基础上收到反馈并进行改进,不必等到开发周期后期才寻找…

二十四、Python基础语法(变量进阶)

一、引用 在定义变量的时候, 解释器会给变量和数据分别在内存中分配内存,变量中保存的是数据的地址, 称为引用,Python 中数据的传递,传递的都是引用,可以使用 id(变量) 函数,获取变量中引用地址。 # 将数字1在内存中的地址储存到变量a中 a …

人工智能岗位英语面试 - 如何确保模型的可靠性和性能

确保模型的可靠性和性能 1. Precision Precision is a metric that measures how accurate the model’s positive predictions are. It calculates the ratio of true positives (correctly predicted positive cases) to the total number of predicted positives (both tr…

时间比较日期

现在需要一个获取当前时间然后对比一个月后的时间的java方法,比如:当前时间获取到是2024-10-28,然后我写定一个时间2024-10-29,这两个比大小,获取的当前时间要小于我写定的时间返回true否则返回false import java.time…

从头学PHP之数组输出基本函数

上期我们讲到了数组,数组是个特殊的变量,在程序中的重要程度很高,大部分数据处理的时候会用到这种特殊的变量,那么现在让我们继续深入一下吧。 上期我们打印出了数组的值,用print_r()或者var_dump()这俩函数&#xff0…