当前位置: 首页 > article >正文

机器学习 ---逻辑回归

        逻辑回归是属于机器学习里面的监督学习,它是以回归的思想来解决分类问题的一种非常经典的二分类分类器。由于其训练后的参数有较强的可解释性,在诸多领域中,逻辑回归通常用作 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 函数的思想。

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

相关文章:

机器学习 ---逻辑回归

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

拟合损失函数

文章目录 拟合损失函数一、线性拟合1.1 介绍1.2 代码可视化1.2.1 生成示例数据1.2.2 损失函数1.2.3 绘制三维图像1.2.4 绘制等高线1.2.5 损失函数关于斜率的函数 二、 多变量拟合2.1 介绍2.2 代码可视化2.2.1 生成示例数据2.2.2 损失函数2.2.3 绘制等高线 三、 多项式拟合3.1 介…...

【C++基础】多线程并发场景下的同步方法

如果在多线程程序中对全局变量的访问没有进行适当的同步控制(例如使用互斥锁、原子变量等),会导致多个线程同时访问和修改全局变量时发生竞态条件(race condition)。这种竞态条件可能会导致一系列不确定和严重的后果。…...

Linux常见问题解决方法--1

常见安全工具、设备 工具 端口及漏洞扫描:Namp、Masscan 抓包:Wireshark,Burpsuite、Fiddler、HttpCanary Web自动化安全扫描:Nessus、Awvs、Appscan、Xray 信息收集:Oneforall、hole 漏洞利用:MSF、…...

银行卡三要素验证接口:方便快捷地实现银行卡核验功能

银行卡三要素验证API:防止欺诈交易的有力武器 随着互联网的发展,电子支付方式也越来越普及。在支付过程中,银行卡是最常用的支付工具之一。然而,在一些支付场景中,需要对用户的银行卡信息进行验证,以确保支…...

利用JSON数据类型优化关系型数据库设计

利用JSON数据类型优化关系型数据库设计 前言 在关系型数据库中,传统的结构化存储方式要求预先定义好所有的列及其数据类型。 然而,随着业务的发展,这种设计可能会显得不够灵活,尤其是在需要扩展单个列的描述功能时。 JSON数据…...

极简壁纸js逆向

首先抓包,翻页可以看到数据储存在该包 可以看到随着页面变化,只有current在变化 而且载荷都没有加密,看来不用js逆向了 爬取代码 import os import asyncio import aiohttp import jsonheaders {"accept": "application/j…...

Kafka 入门与应用实战:吞吐量优化与与 RabbitMQ、RocketMQ 的对比

前言 在现代微服务架构和分布式系统中,消息队列作为解耦组件,承担着重要的职责。它不仅提供了异步处理的能力,还能确保系统的高可用性、容错性和扩展性。常见的消息队列包括 Kafka、RabbitMQ 和 RocketMQ,其中 Kafka 因其高吞吐量…...

JAVA 接口、抽象类的关系和用处 详细解析

接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口,可以只选择实现接口中的 部分方法(所有的方法都要有,可以一部分已经写具体,另一部分继续保留抽象),原因在于: 抽象类本身…...

数据结构与算法再探(六)动态规划

目录 动态规划 (Dynamic Programming, DP) 动态规划的基本思想 动态规划的核心概念 动态规划的实现步骤 动态规划实例 1、爬楼梯 c 递归(超时)需要使用记忆化递归 循环 2、打家劫舍 3、最小路径和 4、完全平方数 5、最长公共子序列 6、0-1背…...

使用PC版本剪映制作照片MV

目录 制作MV模板时长调整拖动边缘缩短法分割删除法变速法整体调整法 制作MV 导入音乐 导入歌词 点击歌词 和片头可以修改字体: 还可以给字幕添加动画效果: 导入照片,自动创建照片轨: 修改片头字幕:增加两条字幕轨&…...

Python爬虫获取custom-1688自定义API操作接口

一、引言 在电子商务领域,1688作为国内领先的B2B平台,提供了丰富的API接口,允许开发者获取商品信息、店铺信息等。其中,custom接口允许开发者进行自定义操作,获取特定的数据。本文将详细介绍如何使用Python调用1688的…...

Autogen_core: Reflection

目录 代码代码逻辑解释:数据类定义:CoderAgent 类:ReviewerAgent 类:主程序: 完成的功能: 代码 from dataclasses import dataclassdataclass class CodeWritingTask:task: strdataclass class CodeWritin…...

GitHub 仓库的 Archived 功能详解:中英双语

GitHub 仓库的 Archived 功能详解 一、什么是 GitHub 仓库的 “Archived” 功能? 在 GitHub 上,“Archived” 是一个专门用于标记仓库状态的功能。当仓库被归档后,它变为只读模式,所有的功能如提交代码、创建 issue 和 pull req…...

.NET Core缓存

目录 缓存的概念 客户端响应缓存 cache-control 服务器端响应缓存 内存缓存(In-memory cache) 用法 GetOrCreateAsync 缓存过期时间策略 缓存的过期时间 解决方法: 两种过期时间策略: 绝对过期时间 滑动过期时间 两…...

Ubuntu 20.04安装Protocol Buffers 2.5.0

个人博客地址:Ubuntu 20.04安装Protocol Buffers 2.5.0 | 一张假钞的真实世界 安装过程 Protocol Buffers 2.5.0源码下载:https://github.com/protocolbuffers/protobuf/tree/v2.5.0。下载并解压。 将autogen.sh文件中以下内容: curl htt…...

【贪心算法】洛谷P1090 合并果子 / [USACO06NOV] Fence Repair G

2025 - 01 - 21 - 第 45 篇 【洛谷】贪心算法题单 -【 贪心算法】 - 【学习笔记】 作者(Author): 郑龙浩 / 仟濹(CSND账号名) 洛谷 P1090[NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G 【贪心算法】 文章目录 洛谷 P1090[NOIP2004 提高组] 合并果子 / [USACO06…...

14.模型,纹理,着色器

模型、纹理和着色器是计算机图形学中的三个核心概念,用通俗易懂的方式来解释: 1. 模型:3D物体的骨架 通俗解释: 模型就像3D物体的骨架,定义了物体的形状和结构。 比如,一个房子的模型包括墙、屋顶、窗户等…...

【微服务与分布式实践】探索 Dubbo

核心组件 服务注册与发现原理 服务提供者启动时,会将其服务信息(如服务名、版本、所在节点的网络地址等)注册到注册中心。服务消费者则可以从注册中心发现可用的服务提供者列表,并与之通信。注册中心会存储服务的信息&#xff0c…...

Scale AI 创始人兼 CEO采访

Scale AI 创始人兼 CEO 亚历山大王(Alexander Wang)首次亮相节目接受采访。他的公司专注于为人工智能工具提供准确标注的数据。早在 2022 年,王成为世界上最年轻的白手起家亿万富翁。 美国在全球人工智能竞赛中的地位,以及它与中…...

Java 大视界 -- Java 大数据在生物信息学中的应用与挑战(67)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

NeuIPS 2024 | CoT推理的新突破:推理边界框架(RBF)

近年来,大型语言模型(LLMs)在推理任务上的能力不断提升,尤其是 思维链(Chain-of-Thought, CoT) 技术,使得模型可以逐步推演逻辑,提高预测准确率。然而,当前的CoT推理仍然…...

【C】memory 详解

<memory.h> 是一个 C 标准库头文件&#xff0c;提供了一组内存管理函数&#xff0c;用于分配、释放和操作动态内存。这些函数主要操作的是未初始化的内存块&#xff0c;是早期 C 编程中常用的内存操作工具。 尽管在现代 C 编程中更推荐使用<cstring>或<memory&…...

linux——进程树的概念和示例

一些程序进程运行后&#xff0c;会调用其他进程&#xff0c;这样就组成了一个进程树。 比如,在Windows XP的“运行”对话框中输入“cmd”启动命令行控制台&#xff0c;然后在命令行中输入“notepad”启动记事本&#xff0c;那么命令行控制台进程“cmd.exe”和记事本进程“note…...

分布式系统相关面试题收集

目录 什么是分布式系统&#xff0c;以及它有哪些主要特性&#xff1f; 分布式系统中如何保证数据的一致性&#xff1f; 解释一下CAP理论&#xff0c;并说明在分布式系统中如何权衡CAP三者&#xff1f; 什么是分布式事务&#xff0c;以及它的实现方式有哪些&#xff1f; 什么是…...

CSAPP学习:前言

前言 本书简称CS&#xff1a;APP。 背景知识 一些基础的C语言知识 如何阅读 Do-做系统 在真正的系统上解决具体的问题&#xff0c;或是编写和运行程序。 章节 2025-1-27 个人认为如下章节将会对学习408中的操作系统与计算机组成原理提供帮助&#xff0c;于是先凭借记忆将其简单…...

kaggle比赛入门 - House Prices - Advanced Regression Techniques(第三部分)

本文承接上一篇。 1. 数据预处理流水线&#xff08;pipelines&#xff09; from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler, OneHotEnc…...

Linux 命令之技巧(Tips for Linux Commands)

Linux 命令之技巧 简介 Linux ‌是一种免费使用和自由传播的类Unix操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布。Linux继承了Unix以网络为核心的设计思想&#xff0c;是一个性能稳定的多用户…...

从 GShard 到 DeepSeek-V3:回顾 MoE 大模型负载均衡策略演进

作者&#xff1a;小天狼星不来客 原文&#xff1a;https://zhuanlan.zhihu.com/p/19117825360 故事要从 GShard 说起——当时&#xff0c;人们意识到拥有数十亿甚至数万亿参数的模型可以通过某种形式的“稀疏化&#xff08;sparsified&#xff09;”来在保持高精度的同时加速训…...

【番外篇】鸿蒙扫雷天纪:运混沌灵智勘破雷劫天局

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 这一节课我们不学习新的知识&#xff0c;我们来做一个扫雷小游戏 目录 扫雷小游戏概述一、扫雷游戏分析…...