探究Logistic回归:用数学解释分类问题

文章目录

  • 前言
  • 回归和分类
  • Logistic回归
    • 线性回归
    • Sigmoid函数
    • 把回归变成分类
    • Logistic回归算法的数学推导
    • Sigmoid函数与其他激活函数的比较
  • Logistic回归实例
    • 1. 数据预处理
    • 2. 模型定义
    • 3. 训练模型
    • 4. 结果可视化
  • 结语


前言

当谈论当论及机器学习中的回归和分类问题时,很容易被“Logistic回归”中的“回归”一词所误导。尽管Logistic回归中有"回归"二字,但它实际上是一种用于分类问题的算法,而不是回归问题。在这篇博客中,我们将深入研究Logistic回归,讨论其背后的原理以及如何手动实现它。



回归和分类

在机器学习领域,回归(Regression)分类(Classification) 是两种主要的预测问题类型。回归和分类都属于监督学习,但它们解决的问题不同。

  • 回归问题: 旨在预测一个连续值,例如房屋价格、股票价格、销售额等。
  • 分类问题: 关注对数据进行离散类别的预测,将数据分为不同的类别,比如预测一封电子邮件是否为垃圾邮件等。
左回归,右分类

在这里插入图片描述

不要被Logistic回归的名字所欺骗,Logistic回归虽然带有 “回归” 二字,但实质上是一种用于二分类的算法。

Logistic回归

Logistic回归是一种基于概率的线性分类算法,尤其适用于解决二分类问题。

与线性回归不同,它通过将线性函数的输出映射到一个介于0和1之间的概率来实现分类。就这样把连续的预测值转换为概率输出的形式,这个概率可以表示为样本属于某个类别的概率。

在Logistic回归中,我们使用一个称为Sigmoid函数的特殊函数,他叫Logistic(逻辑)函数,也叫激活函数。

简单来说:Logistic回归 = 线性回归 + Sigmoid函数

线性回归

首先,让我们回顾一下线性回归。

线性回归是一种用于建模自变量(输入特征)与因变量(输出)之间线性关系的模型。

线性回归的目标是找到一条直线(或超平面),最大程度地拟合输入数据。其数学表达式为:

Y = β 0 + β 1 X 1 + β 2 X 2 + … + β n X n + ϵ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + \ldots + \beta_nX_n + \epsilon Y=β0+β1X1+β2X2++βnXn+ϵ

其中, Y Y Y 是预测值, β 0 \beta_0 β0 是截距, β 1 , β 2 , … , β n \beta_1, \beta_2, \ldots, \beta_n β1,β2,,βn 是权重, X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1,X2,,Xn 是特征, ϵ \epsilon ϵ 是误差。

线性模型可以表示为:

h ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n h(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_nx_n h(x)=θ0+θ1x1+θ2x2+...+θnxn

其中, h ( x ) h(x) h(x) 是预测值, θ 0 , θ 1 , . . . , θ n \theta_0, \theta_1, ..., \theta_n θ0,θ1,...,θn 是模型的参数。

Sigmoid函数

为了将线性回归转变为分类问题,我们引入了Sigmoid函数

Sigmoid函数是一种常用的激活函数,其图像呈S形状。它的特点是在输入接近正无穷或负无穷时,输出趋近于1或0,而在接近零时,输出约为0.5。

这种性质使得sigmoid函数在将线性输出映射到概率时非常有用。它的导数也相对简单,这对于梯度下降等优化算法至关重要。
Sigmoid函数

把回归变成分类

Sigmoid函数将任意实数值映射到一个范围在0和1之间的概率值。其表达式为:

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

这里, z z z 是线性模型的输出。将Sigmoid函数应用于线性模型的输出,我们得到了Logistic回归的基本公式:

h ( x ) = σ ( θ 0 + θ 1 x 1 + θ 2 x 2 + . . . + θ n x n ) h(x) = \sigma(\theta_0 + \theta_1x_1 + \theta_2x_2 + ... + \theta_nx_n) h(x)=σ(θ0+θ1x1+θ2x2+...+θnxn)

通过这个转换,我们可以将任意实数范围内的输出映射到 [ 0 , 1 ] [0, 1] [0,1]之间。

Logistic回归算法的数学推导

现在我们已经得知Logistic回归是一种分类算法,它使用一个Sigmoid函数将输入映射到0和1之间的概率值。

假设我们有一个样本 x x x,那么它属于类别1的概率可以表示为:

P ( y = 1 ∣ x ) = 1 1 + e − ( w T x + b ) P(y=1|x) = \frac{1}{1+e^{-(w^Tx + b)}} P(y=1∣x)=1+e(wTx+b)1

其中, w w w 是特征的权重向量, x x x 是输入特征向量, b b b是偏置项(bias)。我们可以将所有样本的预测结果表示为一个向量:

y ^ = σ ( X w + b ) \hat{y} = \sigma(Xw+b) y^=σ(Xw+b)

其中, σ ( x ) \sigma(x) σ(x)是Sigmoid函数:

σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1

我们的目标是最小化交叉熵损失函数:

J ( w , b ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ ( y ^ ( i ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − y ^ ( i ) ) ] J(w,b) = -\frac{1}{m}\sum_{i=1}^{m}{[y^{(i)}\log(\hat{y}^{(i)})+(1-y^{(i)})\log(1-\hat{y}^{(i)})]} J(w,b)=m1i=1m[y(i)log(y^(i))+(1y(i))log(1y^(i))]

其中, m m m是样本数量, y ( i ) y^{(i)} y(i)是第 i i i个样本的真实标签, y ^ ( i ) \hat{y}^{(i)} y^(i)是它的预测结果。我们可以使用梯度下降法来最小化损失函数。权重和偏置项的更新规则如下:

w = w − α ∂ J ( w , b ) ∂ w w = w - \alpha\frac{\partial J(w,b)}{\partial w} w=wαwJ(w,b)

b = b − α ∂ J ( w , b ) ∂ b b = b - \alpha\frac{\partial J(w,b)}{\partial b} b=bαbJ(w,b)

其中, α \alpha α是学习率。我们可以通过计算损失函数对权重和偏置项的偏导数来得到它们的梯度:

∂ J ( w , b ) ∂ w = 1 m X T ( y ^ − y ) \frac{\partial J(w,b)}{\partial w} = \frac{1}{m}X^T(\hat{y}-y) wJ(w,b)=m1XT(y^y)

∂ J ( w , b ) ∂ b = 1 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) \frac{\partial J(w,b)}{\partial b} = \frac{1}{m}\sum_{i=1}^{m}{(\hat{y}^{(i)}-y^{(i)})} bJ(w,b)=m1i=1m(y^(i)y(i))

Sigmoid函数与其他激活函数的比较

Sigmoid函数在Logistic回归中被广泛使用,因为它能将输出转化为概率值。

除了sigmoid函数,还有其他一些常用的激活函数,比如ReLU(Rectified Linear Unit)函数。这些函数在神经网络和深度学习中扮演着重要的角色。
ReLU

相比于Sigmoid函数,ReLU的主要优势在于它的计算速度更快且更容易收敛,并且在处理大规模数据和深层神经网络时表现更好。它解决了梯度消失问题,并且能够更好地适应非线性关系。

每种激活函数都有自己的特点和适用范围,在实际应用中,选择使用哪种激活函数取决于具体的问题和数据集特征。如果需要将输出转化为概率值,Logistic回归中的Sigmoid函数是一个不错的选择。如果需要处理更复杂的非线性关系,深度学习中的ReLU函数可能更适合。


Logistic回归实例

1. 数据预处理

首先,我们需要加载数据集,数据使用Scikit-learn里的鸢尾花数据集(Iris Dataset)。在Scikit-learn中,可以使用load_iris()函数来加载数据集。为了简化问题,我们只使用两个特征:萼片长度(sepal length)和花瓣长度(petal length)。同时,我们只考虑两个类别:山鸢尾(Iris-setosa)和变色鸢尾(Iris-versicolor),并将它们分别标记为0和1。

from sklearn.datasets import load_iris
import numpy as np

iris = load_iris()
X = iris.data[:, [0, 2]]
y = (iris.target != 0) * 1

print('Number of examples:', len(y))
print('Number of features:', X.shape[1])
print('Classes:', np.unique(y))

输出:
output

2. 模型定义

接下来,我们定义Logistic回归模型。

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

class LogisticRegression:
    def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):
        self.lr = lr
        self.num_iter = num_iter
        self.fit_intercept = fit_intercept
        self.verbose = verbose
    
    def __add_intercept(self, X):
        intercept = np.ones((X.shape[0], 1))
        return np.concatenate((intercept, X), axis=1)
    
    def __loss(self, h, y):
        return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
    
    def fit(self, X, y):
        if self.fit_intercept:
            X = self.__add_intercept(X)
        
        self.theta = np.zeros(X.shape[1])
        
        for i in range(self.num_iter):
            z = np.dot(X, self.theta)
            h = sigmoid(z)
            gradient = np.dot(X.T, (h - y)) / y.size
            self.theta -= self.lr * gradient
            
            if self.verbose and i % 10000 == 0:
                z = np.dot(X, self.theta)
                h = sigmoid(z)
                print('loss: ', self.__loss(h, y))
    
    def predict_prob(self, X):
        if self.fit_intercept:
            X = self.__add_intercept(X)
    
        return sigmoid(np.dot(X, self.theta))
    
    def predict(self, X, threshold=0.5):
        return self.predict_prob(X) >= threshold

3. 训练模型

现在,我们可以通过调用LogisticRegression类来训练模型。我们将样本分成训练集和测试集,使用训练集来训练模型,并使用测试集来评估模型性能。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LogisticRegression(lr=0.1, num_iter=300000)
model.fit(X_train, y_train)

print('Training accuracy:', (model.predict(X_train) == y_train).mean())
print('Test accuracy:', (model.predict(X_test) == y_test).mean())

输出:
output

4. 结果可视化

最后,我们可以将模型的决策边界可视化。由于我们只使用了两个特征,所以决策边界是一条直线。

import matplotlib.pyplot as plt

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='viridis')

x1_min, x1_max = X[:, 0].min(), X[:, 0].max(),
x2_min, x2_max = X[:, 1].min(), X[:, 1].max(),
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_prob(grid).reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='red')

输出:
output
这个实例展示了如何使用Logistic回归算法来解决二分类问题。通过加载鸢尾花数据集,选择两个特征并标记两个类别,我们定义了LogisticRegression类来训练和预测模型。在这个简单的示例中,模型在训练集和测试集上都得到了100%的准确度,说明模型具有很好的适应能力和泛化能力。
需要注意的是,在实际应用中,需要考虑更多的因素,例如数据集的大小、特征的选择、模型的超参数等等。此外,在使用Logistic回归模型时,还需要进行特征缩放、正则化等处理,以提高模型的性能和泛化能力。



结语

Logistic回归是一种简单而有效的二元分类算法,它通过逻辑函数将线性回归的预测值转换为概率值。在实际应用中,Logistic回归通常与其他算法(如决策树和随机森林)结合使用,以提高分类的准确率。它也可以通过特征工程和正则化等方法进行改进,以适应不同的数据集和问题。同时,根据实际情况选择适当的激活函数,在解决其他分类问题时也是非常重要的。

希望这篇博客对你有所帮助!如果你有任何问题或疑惑,欢迎在下方留言讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言——指针(五)

📝前言: 上篇文章C语言——指针(四)更加深入的介绍了不同类型指针的特点,这篇文章主要想记录一下函数与指针的结合运用以及const和assert关于指针的用法: 1,函数与指针 2,const 3&am…

Python基础语法详解,零基础入门必须掌握的知识点

文章目录 一、Python输出1、repr() 或 str() 转成字符串2、字符串填充空格进行格式化3、!a (使用 **ascii()**), !s (使用 **str()**) 和 !r (使用 **repr()**) 可以用于在格式化某个值之前对其进行转化 二、Python标识符三、Python保留字符(关键字)四、…

【CPCI会议、知网检索】第三届城市规划与区域经济国际学术会议(UPRE 2024)

第三届城市规划与区域经济国际学术会议(UPRE 2024) 2024 3rd International Conference on Urban Planning and Regional Economy 第三届城市规划与区域经济国际学术会议(UPRE 2024)于2024年4月19-21日在泰国曼谷举行。会议旨在…

Ubuntu安装nvidia GPU显卡驱动教程

Ubuntu安装nvidia显卡驱动 1.安装前安装必要的依赖 sudo apt-get install build-essential sudo apt-get install g sudo apt-get install make2.到官网下载对应驱动 https://www.nvidia.cn/Download/index.aspx?langcn 3.卸载原有驱动 sudo apt-get remove --purge nvidi…

【Python系列】Python函数

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

帆软报表决策报表改变屏幕大小后出现字体大小或滚动条异常解决方案:双向自适应

帆软报表决策报表改变屏幕大小后出现字体大小或滚动条异常。 解决方案:在模板和报表块中配置双向自适应 在每一个报表块中设置:

HGNN复现

python版本:3.6.13 torch版本:http://download.pytorch.org/whl/cpu/torch-0.4.0-cp36-cp36m-win_amd64.whl 安装torch: pip install http://download.pytorch.org/whl/cpu/torch-0.4.0-cp36-cp36m-win_amd64.whl 除了numpy、matplotlib、…

Ubuntu环境下使用GDB调试C语言项目

1. 安装gdb //终端输入 sudo apt-get install gdb 2. 启动gdb gdb GDB常用命令大全,参考此篇博客 使用GDB调试C项目中的makefile 1.在内核配置中启用调试信息: 在内核配置中,确保启用了调试信息。可以通过以下步骤来配置内核&#xff1a…

验证码的多种生成策略

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 第一种 a.导入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.10</ver…

解决Kettle无法传输生偏字的问题

最近在搞数据传输&#xff0c;然后涉及到人名的时候&#xff0c;难免会碰到生僻字&#xff0c;utf8是无法存储的&#xff0c;然后我把目标表改为utf8mb4&#xff0c;但是还是无法传输生僻字&#xff0c;这就很奇怪了&#xff0c;明明两边的数据库都是MySQL 5.7x&#xff0c;但是…

3D热图绘制教程

本期教程 原文链接https://mp.weixin.qq.com/s/EyBs6jn78zOomcTv1aP52g 6 3D热图的绘制教程 基于《热图绘制教程》专栏,本教程已更新了5个章节,不知道大家是否有所收获。对于小杜个人来说,真的需要不断的复习和练习才可以记住,但是在自己使用的时候也需要重复的看自己的学…

【Linux】resolv.conf 文件

resolv.conf resolv.conf 文件 是 DNS 的 client 端使用的文件&#xff0c;用于设置 DNS 服务器的 ip 地址以及 DNS 域名&#xff0c;还可以配置域名搜索顺序等等。主要包含如下关键字&#xff1a;nameserver、domain、search、sortlist、options。设置的格式都是 关键字空格 …

【如何写论文】——写作提效的n个技巧:Word图、表自动编号 +Zotero实现参考文献自动化

目录 一、Word图、表自动编号1.1、单级编号1.2、多级编号1.3、交叉引用1.4、修改题注格式 二、Zotero实现参考文献自动化最后 一、Word图、表自动编号 在论文写作中&#xff0c;通常会包含数十张图片或表格。默认情况下&#xff0c;这些图片和表格都是没有编号的。 然而&…

C语言第十六集(前)

1.关于那个整形存储入char的 是先取好补码,再截断 例: 2.%u是以十进制的形式打印无符号整数 3.注意(背):存储的char类型变量的补码为10000000的直接解析为-128 4.signed char 类型的变量取值范围是-128~127 5.unsigned char 类型的变量取值范围是0~255 6.有符号类型的变量…

Linus:我休假的时候也会带着电脑,否则会感觉很无聊

目录 Linux 内核最新版本动态 关于成为内核维护者 代码好写&#xff0c;人际关系难处理 内核维护者老龄化 内核中 Rust 的使用 关于 AI 的看法 参考 12.5-12.6 日&#xff0c;Linux 基金会组织的开源峰会&#xff08;OSS&#xff0c;Open Source Summit&#xff09;在日…

matplot绘图时图像太大报错但能保存

matplot绘图时&#xff0c;图像太大&#xff0c;可能在jupyter里面报错&#xff0c;但是图像可以保存。 报错&#xff1a;Image size of 12237479x675 pixels is too large. It must be less than 2^16 in each direction. 在这里插入图片描述

编程创意汇聚地,打造个性作品集 | 开源日报 No.97

spring-projects/spring-boot Stars: 70.4k License: Apache-2.0 Spring Boot 是一个用于简化 Spring 应用程序开发的框架&#xff0c;它通过提供默认配置和约定大于配置的方式来减少开发者的工作量。Spring Boot 可以快速地创建独立的、生产级别的基于 Spring 框架的应用程序…

简单的越权

越权漏洞 危害 越权漏洞分为水平越权和垂直越权&#xff1b; 水平越权容易造成敏感信息的泄露&#xff1b;垂直越权容易造成服务器权限丢失。 普通用户执行管理员操作时&#xff0c;可能会执行一些上传操作&#xff0c;例如一句话木马 挖掘 我会在数据包中寻找例如id、us…

报错处理集

这个报错处理集的错误来源于编译arm平台的so文件产生的。但是后续可以补充成linux一个大的错误处理集。 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 第一次整理的时间是2023年12月8日10:05:59&#xff0c;以下错误来源于欧拉系统编译…

单片机第三季-第四课:STM32下载、MDK和调试器

目录 1&#xff0c;扩展板使用的STM32芯片类型 2&#xff0c;使用普中科技软件下载程序 3&#xff0c;keil介绍 4&#xff0c;JLINK调试器介绍 5&#xff0c;使用普中的调试器进行debug 6&#xff0c;使用Simulator仿真 1&#xff0c;扩展板使用的STM32芯片类型 扩展版…