机器学习 ---逻辑回归

        逻辑回归是属于机器学习里面的监督学习,它是以回归的思想来解决分类问题的一种非常经典的二分类分类器。由于其训练后的参数有较强的可解释性,在诸多领域中,逻辑回归通常用作 baseline 模型,以方便后期更好的挖掘业务相关信息或提升模型性能

一、逻辑回归的核心思想

1. 线性回归回顾

        在理解逻辑回归之前,先简单回顾一下线性回归。线性回归试图找到一个线性函数,来拟合数据的特征与目标值之间的关系。假设我们有n个特征x_1, x_2, \cdots, x_n,线性回归模型可以表示为:\hat{y} = \theta_0 + \theta_1x_1 + \theta_2x_2 + \cdots + \theta_nx_n = \sum_{i = 0}^{n} \theta_ix_i,其中,\hat{y}是预测值,\theta_i是模型的参数。

2. 逻辑回归的转变

        逻辑回归的目标是进行分类,而不是预测连续值。对于二分类问题,我们希望模型能够输出样本属于某个类别的概率。为了实现这一点,逻辑回归引入了 sigmoid 函数,将线性回归的输出映射到[0,1]区间。

sigmoid 函数的定义为:g(z) = \frac{1}{1 + e^{-z}}

        其中,z是线性回归的输出,即z = \sum_{i = 0}^{n} \theta_ix_i

        经过 sigmoid 函数的变换后,我们得到样本属于正类(通常标记为 1)的概率P(y = 1 | x; \theta) = g(\sum_{i = 0}^{n} \theta_ix_i) = \frac{1}{1 + e^{-\sum_{i = 0}^{n} \theta_ix_i}}

        那么样本属于负类(通常标记为 0)的概率为:P(y = 0 | x; \theta) = 1 - P(y = 1 | x; \theta) = \frac{e^{-\sum_{i = 0}^{n} \theta_ix_i}}{1 + e^{-\sum_{i = 0}^{n} \theta_ix_i}}

二、逻辑回归的损失函数

1. 损失函数的定义

        损失函数用于衡量模型预测值与真实值之间的差异。对于逻辑回归,常用的损失函数是对数损失函数(Log Loss)。

        单个样本的对数损失函数为:L(y, \hat{y}) = -y \log(\hat{y}) - (1 - y) \log(1 - \hat{y}),其中,y是真实标签(0 或 1),\hat{y}是模型预测的概率。

        对于m个样本的数据集,总的损失函数(也称为代价函数)为:J(\theta) = -\frac{1}{m} \sum_{i = 1}^{m} [y^{(i)} \log(\hat{y}^{(i)}) + (1 - y^{(i)}) \log(1 - \hat{y}^{(i)})],这里, y^{(i)}\hat{y}^{(i)}分别表示第i个样本的真实标签和预测概率。

2. 损失函数的解释

        对数损失函数的设计基于极大似然估计的思想。我们希望模型预测的概率分布尽可能接近真实的标签分布。当真实标签y = 1时,对数损失函数中的-y \log(\hat{y})项促使模型提高预测概率\hat{y}(减小损失函数的值);当y = 0时,-(1 - y) \log(1 - \hat{y})项促使模型降低预测概率\hat{y}(减小损失函数的值)。通过最小化这个损失函数,我们可以找到最优的模型参数\theta

三、梯度下降求解逻辑回归

1.什么是梯度

        梯度:梯度的本意是一个向量,由函数对每个参数的偏导组成,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大。

2. 梯度下降的原理

        梯度下降是一种常用的优化算法,用于寻找函数的最小值。其基本思想是沿着函数梯度的反方向,逐步更新参数,使得函数值不断减小。

        对于逻辑回归的损失函数J(\theta),其梯度为:\nabla J(\theta) = \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} \sum_{i = 1}^{m} (\hat{y}^{(i)} - y^{(i)})x_j^{(i)}

其中,x_j^{(i)}表示第i个样本的第j个特征值。

3. 梯度下降的迭代过程

        在梯度下降算法中,我们通过不断迭代更新参数\theta\theta_j := \theta_j - \eta \frac{\partial J(\theta)}{\partial \theta_j},其中,\eta是学习率,控制每次参数更新的步长,是 0 到 1 之间的值,是个超参数,需要我们自己来确定大小。

        学习率的选择非常重要,如果学习率过小,算法收敛速度会很慢;如果学习率过大,可能会导致算法无法收敛,甚至发散。在实际应用中,通常需要通过实验来选择合适的学习率。

4. 随机梯度下降和批量梯度下降

  • 批量梯度下降(Batch Gradient Descent,BGD):每次迭代都使用整个数据集来计算梯度,计算准确,但当数据集很大时,计算量非常大,效率较低。
  • 随机梯度下降(Stochastic Gradient Descent,SGD):每次迭代只使用一个样本数据来计算梯度,计算速度快,但梯度更新方向可能不稳定,导致收敛过程有波动。
  • 小批量梯度下降(Mini - Batch Gradient Descent,MBGD):结合了 BGD 和 SGD 的优点,每次迭代使用一小部分样本数据(称为一个 mini - batch)来计算梯度,既保证了计算效率,又能使梯度更新相对稳定。

5.梯度下降算法流程

  1. 随机初始参数;
  2. 确定学习率;
  3. 求出损失函数对参数梯度;
  4. 按照公式更新参数;
  5. 重复 3 、 4 直到满足终止条件(如:损失函数或参数更新变化值小于某个阈值,或者训练次数达到设定阈值)。

四、逻辑回归的动手实现

        下面我们使用 Python 和 NumPy 库来手动实现逻辑回归算法,并在一个简单的数据集上进行训练和测试。

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 生成一个包含1000个样本,20个特征的二分类数据集
X, y = make_classification(n_samples = 1000, n_features = 20, 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)def sigmoid(z):return 1 / (1 + np.exp(-z))class LogisticRegression:def __init__(self, learning_rate = 0.01, num_iterations = 1000):self.learning_rate = learning_rateself.num_iterations = num_iterationsself.theta = Nonedef fit(self, X, y):m, n = X.shape# 初始化参数thetaself.theta = np.zeros(n)for _ in range(self.num_iterations):z = np.dot(X, self.theta)h = sigmoid(z)gradient = np.dot(X.T, (h - y)) / mself.theta -= self.learning_rate * gradientdef predict(self, X):z = np.dot(X, self.theta)h = sigmoid(z)return np.where(h >= 0.5, 1, 0)# 创建逻辑回归模型实例
model = LogisticRegression(learning_rate = 0.01, num_iterations = 1000)
# 训练模型
model.fit(X_train, y_train)
# 进行预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

        通过以上步骤,我们成功地手动实现了一个简单的逻辑回归模型,并在生成的数据集上进行了训练和评估。在实际应用中,还可以进一步优化模型,比如通过交叉验证来更准确地选择学习率,使用 L1 或 L2 正则化防止过拟合,从而让模型在复杂的实际场景中表现得更加出色。

五、总结

        逻辑回归是机器学习里经典的二分类分类器,因参数可解释性强常作 baseline 模型。它的核心思想是引入 sigmoid 函数,将线性回归输出映射到 [0,1] 区间,以得出样本分属正、负类的概率。常用对数损失函数衡量预测与真实值差异,基于极大似然估计思想找最优参数。通过梯度下降求解,沿梯度反方向更新参数,有批量、随机、小批量梯度下降等几种方式。

        本文使用用 Python 和 NumPy 库等手动实现了一个简单的逻辑回归,在实际应用中还可以通过交叉验证、正则化等方法进行优化。         

        此外,在实际应用中,逻辑回归不仅可以用于简单的二分类问题,还能够通过扩展(如多分类逻辑回归、有序逻辑回归等)来处理更为复杂的分类任务。此外,逻辑回归也是许多其他复杂模型的基石,例如神经网络中的激活函数就借鉴了 sigmoid 函数的思想。

        希望这篇博客能帮助你全面深入地理解逻辑回归。如果你在实际应用中遇到了相关问题,或者对某些内容还有疑问,欢迎在评论区留言交流。你也可以分享自己在使用朴素贝叶斯算法过程中的经验和心得,让更多的人受益。

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

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

相关文章

volatile之四类内存屏障指令 内存屏障 面试重点 底层源码

目录 volatile 两大特性 可见性 有序性 总结 什么是内存屏障 四个 CPU 指令 四大屏障 重排 重排的类型 为什么会有重排? 线程中的重排和可见性问题 如何防止重排引发的问题? 总结 happens-before 和 volatile 变量规则 内存屏障指令 写操作…

模拟电子技术-常用半导体器件

模拟电子技术-常用半导体器件 一、半导体基础知识二、PN结2.1 PN结简介2.2 PN结正向导电性2.2.1 正向电压2.2.2 反向电压2.2.3 PN结伏安特性 三、二极管3.1 二极管伏安特性曲线3.2 二极管参数和等效电路3.2.1 性能参数3.2.2 等效电路 3.3 二极管限幅和整流应用(正向特性)3.4 稳…

2024年博客之星主题创作|2024年蓝桥杯与数学建模年度总结与心得

引言 2024年,我在蓝桥杯编程竞赛和数学建模竞赛中投入了大量时间和精力,这两项活动不仅加深了我对算法、数据结构、数学建模方法的理解,还提升了我的解决实际问题的能力。从蓝桥杯的算法挑战到数学建模的复杂应用,我在这些竞赛中…

javascript-es6 (一)

作用域(scope) 规定了变量能够被访问的“范围”,离开了这个“范围”变量便不能被访问 局部作用域 函数作用域: 在函数内部声明的变量只能在函数内部被访问,外部无法直接访问 function getSum(){ //函数内部是函数作用…

使用eNSP配置GRE VPN实验

实验拓扑 实验需求 1.按照图示配置IP地址 2.在R1和R3上配置默认路由使公网区域互通 3.在R1和R3上配置GRE VPN,使两端私网能够互相访问,Tunne1口IP地址如图 4.在R1和R3上配置RIPv2来传递两端私网路由 GRE VPN配置方法: 发送端: …

Ansible自动化运维实战--script、unarchive和shell模块(6/8)

文章目录 一、script模块1.1、功能1.2、常用参数1.3、举例 二、unarchive模块2.1、功能2.2、常用参数2.3、举例 三、shell模块3.1、功能3.2、常用参数3.3、举例 一、script模块 1.1、功能 Ansible 的 script 模块允许你在远程主机上运行本地的脚本文件,其提供了一…

大数据Hadoop入门1

目录 相关资料 第一部分 1.课程内容大纲和学习目标 2.数据分析和企业数据分析方向 3.数据分析基本流程步骤 4.大数据时代 5.分布式和集群 6.Linux操作系统概述 7.VMware虚拟机概念与安装 8.centos操作系统的虚拟机导入 9.VMware虚拟机常规使用、快照 第二部分 1.课…

项目概述与规划 (I)

项目概述与规划 (I) JavaScript的学习已经接近尾声了,最后我们将通过一个项目来讲我们在JavaScript中学习到的所有都在这个项目中展现出来,这个项目的DEMO来自于Udemy中的课程,作者是Jonas Schmedtmann; 项目规划 项目步骤 用户…

项目集成RabbitMQ

文章目录 1.common-rabbitmq-starter1.创建common-rabbitmq-starter2.pom.xml3.自动配置1.RabbitMQAutoConfiguration.java2.spring.factories 2.测试使用1.创建common-rabbitmq-starter-demo2.目录结构3.pom.xml4.application.yml5.TestConfig.java 配置交换机和队列6.TestCon…

RK3568 adb使用

文章目录 一、adb介绍**ADB 主要功能****常用 ADB 命令****如何使用 ADB****总结** 二、Linux下载adb**方法 1:使用包管理器(适用于 Ubuntu/Debian 系统)****方法 2:通过 Snap 安装(适用于支持 Snap 的系统&#xff09…

STM32项目分享:智能宠物喂食系统(升级版)

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 PCB图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: STM32智能宠物喂食系统(升级版) (资…

软件测试 —— 性能测试(jmeter)

软件测试 —— 性能测试(jmeter) 什么是jmeter安装jmeterjmeter常用组件线程组取样器结果树 我们之前学习了接口测试工具Postman,我们今天要学习的是性能测试工具——jmeter 什么是jmeter Apache JMeter 是一个开源的性能测试工具&#xff…

电阻补偿OTA的噪声分析

上文(补偿电阻对ota零极点的影响-CSDN博客)分析了补偿电阻对五管OTA零极点的影响,该篇借分析电阻补偿OTA的噪声来串联复习下噪声章节的一些基础概念。 1.噪声分析 辅助定理 开始分析OTA噪声之前,先引入一个辅助定理(R…

从CRUD到高级功能:EF Core在.NET Core中全面应用(四)

初识表达式树 表达式树:是一种可以描述代码结构的数据结构,它由一个节点组成,节点表示代码中的操作、方法调用或条件表达式等,它将代码中的表达式转换成一个树形结构,每个节点代表了代码中的操作例如,如果…

C语言初阶力扣刷题——349. 两个数组的交集【难度:简单】

1. 题目描述 力扣在线OJ题目 给定两个数组,编写一个函数来计算它们的交集。 示例: 输入:nums1 [1,2,2,1], nums2 [2,2] 输出:[2] 输入:nums1 [4,9,5], nums2 [9,4,9,8,4] 输出:[9,4] 2. 思路 直接暴力…

在Qt中实现点击一个界面上的按钮弹窗到另一个界面

文章目录 步骤 1:创建新窗口类步骤 2:设计窗口的 UI步骤 3:设计响应函数 以下是一个完整的示例,展示在Qt中如何实现在一个窗口中通过点击按钮弹出一个新窗口。 步骤 1:创建新窗口类 假设你要创建一个名为 WelcomeWidg…

dm8在Linux环境安装精简步骤说明(2024年12月更新版dm8)

dm8在Linux环境安装详细步骤 - - 2025年1月之后dm8 环境介绍1 修改操作系统资源限制2 操作系统创建用户3 操作系统配置4 数据库安装5 初始化数据库6 实例参数优化7 登录数据库配置归档与备份8 配置审计9 创建用户10 屏蔽关键字与数据库兼容模式11 jdbc连接串配置12 更多达梦数据…

Spring MVC 综合案例

目录 一. 加法计算器 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 3. 服务器端代码 4. 运行测试 二. 用户登录 1. 准备工作 2. 约定前后端交互接口 需求分析 接口定义 (1) 登录界面接口 (2) 首页接口 3. 服务器端代码 4. 运行测试 三. 留言板 1. 准备…

神经网络|(一)加权平均法,感知机和神经元

【1】引言 从这篇文章开始,将记述对神经网络知识的探索。相关文章都是学习过程中的感悟和理解,如有雷同或者南辕北辙的表述,请大家多多包涵。 【2】加权平均法 在数学课本和数理统计课本中,我们总会遇到求一组数据平均值的做法…

PostGIS笔记:PostgreSQL 数据库与用户 基础操作

数据库基础操作包括数据模型的实现、添加数据、查询数据、视图应用、创建日志规则等。我这里是在Ubuntu系统学习的数据库管理。Windows平台与Linux平台在命令上几乎无差异,只是说在 Windows 上虽然也能运行良好,但在性能、稳定性、功能扩展等方面&#x…