【Sklearn-LR驯化】一文搞懂分类基石模型-逻辑回归使用总结

【Sklearn-驯化】一文搞懂分类基石模型-逻辑回归使用总结

 
本次修炼方法请往下查看
在这里插入图片描述

🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 免费获取相关内容文档关注:微信公众号,发送 pandas 即可获取
🎇 相关内容视频讲解 B站

🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验

🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100%

📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。


文章目录

    • 🎯 1. 基本介绍
    • 💡 2. 理论介绍
    • 🔍 3. 代码实践
      • 3.1 自己实现
      • 3.2 Sklearn实现
      • 3.3 LR重要参数介绍
    • 🔍 4. 注意事项
    • 🔍 5. 总结

🎯 1. 基本介绍

  逻辑回归是一种广泛应用于分类问题的统计方法,特别是在二分类问题中。尽管名字中有“回归”二字,逻辑回归实际上是一种分类算法。在Python的scikit-learn库中,逻辑回归模型通过LogisticRegression类实现,它使用最大似然估计来训练模型。
  逻辑回归比较高效,不需要太大计算,不需要对特征进行缩放,容易实现。但是该算法分类效果一般,且不能处理非线性问题,因为它的决策边界是线性的。因此,当数据分界面是线性平面的时候,可以采用该算法进行分类。
  个人觉得逻辑回归设计的巧妙一点的地方在于,将wx通过sigmod函数缩放(0,1)之间,这样就可以通过设置sigmoid的函数值来归为哪类,从而使输出值满足二项分布的条件。
  逻辑回归的损失函数为交叉熵损失。这个我个人有这么一个解释:对于分类问题,他的损失函数其实是0-1损失函数,但是这种函数很难进行求解,优化,一般都采用类似趋势的可求导函数进行替代,而逻辑回归则通过极大似然估计来转换成log损失函数来替代0-1损失函数

💡 2. 理论介绍

  在线性回归中,我们假设因变量Y和自变量X之间存在以下线性关系:Y = β₀ + β₁X₁ + β₂X₂ + ... + βₙXₙ,其中β₀是截距,β₁至βₙ是自变量X的系数。通过最小化损失函数来确定最佳的系数估计值。
  在博客中我们会详细推导出最小二乘法的公式,这是一种常见的求解线性回归系数的方法。
  逻辑回归假设 p ( y ∣ x , θ ) p(y|x,\theta) p(yx,θ)服从二项分布,同时对 θ T x \theta^Tx θTx通过函数sigmoid进行数据映射,该函数公式和图表如下所示:

h θ ( x ) = 1 1 + e − z h_{\theta} (x)=\frac{1}{1 + e^{-z}} hθ(x)=1+ez1
其中 z = θ 0 + θ 1 x 1 + θ 2 x 2 + . . . . . . + θ n x n = θ T x z=\theta_{0} + \theta_{1}x_{1}+\theta_{2}x_{2}+......+\theta_{n}x_{n}=\theta^{T}x z=θ0+θ1x1+θ2x2+......+θnxn=θTx

  • 具体的推导过程如下所示:

p ( y = 1 ∣ x ; θ ) = h θ ( x ) p(y=1|x;\theta)=h_{\theta}(x) p(y=1∣x;θ)=hθ(x)
p ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) p(y=0|x;\theta)=1-h_{\theta}(x) p(y=0∣x;θ)=1hθ(x)

  • 对上面的二项分布的概率函数的具体表达公式如下所示:

p ( y ∣ x ; θ ) = ( h θ ( x ) ) y ∗ ( 1 − h θ ( x ) ) ( 1 − y ) p(y|x;\theta)=(h_{\theta}(x))^y *(1-h_{\theta}(x))^{(1-y)} p(yx;θ)=(hθ(x))y(1hθ(x))(1y)

  • 对上面的概率函数通过MLE进行参数估计:

L ( θ ) = ∏ i = 1 m p ( y i ∣ x i ; θ ) L(\theta)=\prod_{i=1}^{m}p(y^{i}|x^{i};\theta) L(θ)=i=1mp(yixi;θ)
L ( θ ) = ∏ i = 1 m ( h θ ( x ( i ) ) ) y ( i ) ∗ ( 1 − h θ ( x ( i ) ) ) ( 1 − y ( i ) ) L(\theta)=\prod_{i=1}^{m}(h_{\theta}(x^{(i)}))^{y^{(i)}}*(1-h_{\theta}(x^{(i)}))^{(1-y^{(i)})} L(θ)=i=1m(hθ(x(i)))y(i)(1hθ(x(i)))(1y(i))

  • 对上面的似然函数取对数:

l ( θ ) = l o g ( L ( θ ) ) = ∑ i = 1 m y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) l(\theta)=log(L(\theta))=\sum_{i=1}^{m}y^{(i)}log(h_{\theta}(x^{(i)})) + (1-y^{(i)})log(1-h_{\theta}(x^{(i)})) l(θ)=log(L(θ))=i=1my(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))

  • MLE的目的就是求使得 l ( θ ) l(\theta) l(θ)取最大值的 θ \theta θ,由于函数有很好的凹凸性,故可以通过梯度上升法来求得最大值,为了求解的方便可以在前面添加一个负号,近似的求得函数的最优解:
  • 梯度下降法来求取 J ( θ ) J(\theta) J(θ)的最小值,其中参数 θ \theta θ的更新过程如下所示:

θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta_{j}: = \theta_{j}-\alpha\frac{\partial}{\partial \theta_{j}}J(\theta) θj:=θjαθjJ(θ)

  • 其中学习步长为 α \alpha α,具体的求导过程如下所示:

∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) 1 h θ ( x i ) ∂ ∂ θ j h θ ( x ( i ) ) − ( 1 − y i ) 1 1 − h θ ( x ( i ) ) ∂ ∂ θ j h θ ( x ( i ) ) ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}\frac{1}{h_{\theta}(x^{i})}\frac{\partial}{\partial \theta_{j}}h_{\theta}(x^{(i)})-(1-y^{i})\frac{1}{1-h_{\theta}(x^{(i)})}\frac{\partial}{\partial \theta_{j}}h_{\theta}(x^{(i)})) θj=m1i=1m(y(i)hθ(xi)1θjhθ(x(i))(1yi)1hθ(x(i))1θjhθ(x(i)))
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) 1 g ( θ T x ( i ) ) − ( 1 − y ( i ) ) 1 1 − g ( θ T x ( i ) ) ) ∂ ∂ θ j g ( θ T x ( i ) ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}\frac{1}{g(\theta^{T}x^{(i)})}-(1-y^(i))\frac{1}{1-g(\theta^{T}x^{(i)})})\frac{\partial}{\partial \theta_{j}}g(\theta^{T}x^{(i)}) θj=m1i=1m(y(i)g(θTx(i))1(1y(i))1g(θTx(i))1)θjg(θTx(i))
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) 1 g ( θ T x ( i ) ) − ( 1 − y ( i ) ) 1 1 − g ( θ T x ( i ) ) ) g ( θ T x ( i ) ) ( 1 − g ( θ T x ( i ) ) ) ∂ ∂ θ j θ T \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m} (y^{(i)}\frac{1}{g(\theta^{T}x^{(i)})} - (1-y^{(i)})\frac{1}{1-g(\theta^{T}x^{(i)})})g(\theta^{T}x^{(i)})(1-g(\theta^{T}x^{(i)}))\frac{\partial}{\partial \theta_{j}}\theta^{T} θj=m1i=1m(y(i)g(θTx(i))1(1y(i))1g(θTx(i))1)g(θTx(i))(1g(θTx(i)))θjθT
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) ( 1 − g ( θ T x ( i ) ) − ( 1 − y ( i ) ) g ( θ T x ( i ) ) ) x j ( i ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}(1-g(\theta^{T}x^{(i)})-(1-y^{(i)})g(\theta^{T}x^{(i)}))x_{j}^{(i)} θj=m1i=1m(y(i)(1g(θTx(i))(1y(i))g(θTx(i)))xj(i)
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) − g ( θ T x ( i ) ) ) x j ( i ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-g(\theta^{T}x^{(i)}))x_{j}^{(i)} θj=m1i=1m(y(i)g(θTx(i)))xj(i)
∂ ∂ θ j = − 1 m ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) ) x j ( i ) \frac{\partial}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}(y^{(i)}-h_{\theta}(x^{(i)}))x_{j}^{(i)} θj=m1i=1m(y(i)hθ(x(i)))xj(i)
∂ ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial}{\partial \theta_{j}}=\frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_{j}^{(i)} θj=m1i=1m(hθ(x(i))y(i))xj(i)

  • 其中对于sigmod函数的求导如下所示,但是由于逻辑回归的函数设定时是带有负号的,所以带入上式计算时需要注意:

f ( x ) = 1 1 + e g ( x ) f(x)=\frac{1}{1+e^{g(x)}} f(x)=1+eg(x)1
∂ ∂ x f ( x ) = − 1 ( 1 + e g ( x ) ) 2 e g ( x ) ∂ ∂ x g ( x ) \frac{\partial}{\partial x}f(x)=-\frac{1}{(1+e^{g(x)})^2}e^{g(x)}\frac{\partial}{\partial x}g(x) xf(x)=(1+eg(x))21eg(x)xg(x)
∂ ∂ x f ( x ) = − 1 1 + e g ( x ) e g ( x ) 1 + e g ( x ) ∂ ∂ x g ( x ) \frac{\partial}{\partial x}f(x)=-\frac{1}{1+e^{g(x)}}\frac{e^{g(x)}}{1+e^{g(x)}}\frac{\partial}{\partial x}g(x) xf(x)=1+eg(x)11+eg(x)eg(x)xg(x)
∂ ∂ x f ( x ) = − f ( x ) ( 1 − f ( x ) ) ∂ ∂ x g ( x ) \frac{\partial}{\partial x}f(x)=-f(x)(1-f(x))\frac{\partial}{\partial x}g(x) xf(x)=f(x)(1f(x))xg(x)

🔍 3. 代码实践

3.1 自己实现

  自行通过python中的numpy库实现LR的代码,具体如下所示:

 import numpy as np
def predict(w, x):'''w:为训练好的参数w,其数据格式为向量shape(n,m)x:为预测数据特征,其数据格式为向量shape(n,m)'''# 创建sigmod函数形式z = np.dot(w, x)p_sigmod = np.exp(z) / (1 + np.exp(z))# 对sigmod函数输出概率进行判断,将概率等于0.5做为阈值if p_sigmod <= 0.5:return 0else:return 1def train(x, y, iter, step):'''x:训练数据特征,数据格式为向量shape(n, m)y:训练数据label,数据格式为向量(n,1)step:为梯度下降的步长iter:为梯度下降迭代的次数'''# 初始化参数w, 这里没有将参数b加入了,# 如果要加参数b需要将训练数据增加一个维度w = np.zeros(x.shape[1])# 进行iter次随机梯度下降操作for i in range(iter):# 每次迭代遍历所以样本进行随机梯度下降算法,每次随机打乱数据的顺序index= list(range(x.shape[0]))random.shuffle(index)for j, idx in enumerate(data_indices):tmp_x, tmp_y = x[idx], y[idx]# 根据上面的公式最后的最小似然函数的求导结果为:#  h(xi)* xi- xi * yi, 所以先构建h(xi)z = np.dot(w, tmp_x)# 再看上面的梯度下降的算法公式,将构建好的求导结果带入w -= step *((np.exp(z) / (1 + np.exp(z)))*tmp_x - tmp_x*tmp_y)# 也可以直接进行梯度下降操作for i in range(iter):z = np.dot(w, x)w -= step *((np.exp(z) / (1 + np.exp(z)))*x- x*y)
return w

3.2 Sklearn实现

  我们构建简单的数据集,通过sklearn来实现lr的过程,具体代码如下所示:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report# 加载iris数据集
iris = load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建逻辑回归模型实例
model = LogisticRegression(max_iter=200)# 训练模型
model.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)# 打印分类报告
print(classification_report(y_test, y_pred))print(f"准确率: {accuracy:.2f}")precision    recall  f1-score   support0.0       0.00      0.00      0.00         01.0       0.00      0.00      0.00         02.0       0.83      1.00      0.91        39
...

3.3 LR重要参数介绍

  在实际的工作中,lr经常调试的参数如下所示:

  • penalty:惩罚方式,默认为"l2",可选择"l1"或"elasticnet"。"l1"使用L1范数作为惩罚项,可以产生稀疏解;"l2"使用L2范数作为惩罚项,可以防止过拟合;"elasticnet"是"l1"和"l2"的组合。

  • C:正则化强度的倒数。与惩罚项相关联,值越小表示更强的正则化。默认为1.0。

  • fit_intercept:是否计算截距项,默认为True。如果选择False,则模型将不会计算截距。

  • solver:优化算法,默认为"lbfgs"。可选择"newton-cg"、“sag"或"liblinear”。"lbfgs"适用于小型数据集;"newton-cg"适用于多分类问题;"sag"适用于大型数据集;"liblinear"适用于二分类问题。

  • max_iter:迭代次数,默认为100。用于控制优化算法的最大迭代次数。

  • multi_class:多分类问题的处理方式,默认为"auto",可选择"ovr"或"multinomial"。"ovr"使用一对多的方法进行多类别分类,"multinomial"使用Softmax回归进行多类别分类。

  • class_weight:类别权重,默认为None。可以使用balanced来自动平衡不均衡的类别。

🔍 4. 注意事项

  • 逻辑回归假设特征和目标变量之间存在线性关系,即使是在分类问题中。
  • 它对异常值不敏感,但对特征的缩放敏感,因此在训练模型前通常需要进行特征标准化或归一化。
  • max_iter参数是最大迭代次数,有时可能需要调整以确保模型能够收敛。
  • 离散特征的增加和减少都很容易,易于模型快速迭代;
  • 稀疏向量内积乘法速廈快,计算结果方便存储,容易扩展;
  • 离散化的特征对异常数据有很强的鲁棒性(比如年龄为300异常值可归为年龄>30这一段);
  • 逻辑回归属于广义线性模型,表达能力受限。单变量离散化为N个后,每个变量有单独的权重,相当于对模型引入了非线性,能够提升模型表达能力,加大拟合;
  • 离散化进行特征交叉,由 M+N 个变量为M*N个变量(将单个特征分成M个取值),进一步引入非线性,提升表达能力;
  • 特征离散化后,模型会更稳定(比如对用户年龄离散化,20-30作为一个区间,不会因为用户年龄,增加一岁变成完全不同的人;
  • 总得来说就是工业界的做法就是:“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡

🔍 5. 总结

  逻辑回归是处理分类问题的强大工具,特别是在二分类问题中。scikit-learn的LogisticRegression类提供了一个易于使用的接口来训练和预测逻辑回归模型。通过本博客的代码示例,我们学习了如何创建逻辑回归模型,进行训练、预测和评估。希望这篇博客能够帮助你更好地理解逻辑回归模型,并将其应用于实际的分类任务中。

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

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

相关文章

Transformer教程之Encoder-Decoder架构

在当今的自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer已经成为不可或缺的模型。它以其高效的并行计算和卓越的性能在多个任务中占据了主导地位。在这篇文章中&#xff0c;我们将深入探讨Transformer的核心——Encoder-Decoder架构&#xff0c;帮助大家…

设计模式原则——接口隔离原则

设计模式原则 设计模式示例代码库地址&#xff1a; https://gitee.com/Jasonpupil/designPatterns 接口隔离原则 要求程序员尽量将臃肿庞大的接口拆分为更小的和更具体的接口&#xff0c;让接口中只包含客户感兴趣的方法接口隔离原则的目标是降低类或模块之间的耦合度&…

STM32将外部SDRAM空间作为系统堆(Heap)空间

概述 stm32可以外扩很大的sram&#xff0c;常见外部sram的初始化函数一般是c语言写的&#xff0c;默认写在main函数里面。stm32初始化首先进入汇编代码startup_stm32f429xx.s&#xff0c;在汇编代码中Reset_Handler&#xff08;复位中断服务程序&#xff09;里面先调用了Syste…

【Python机器学习】自动化特征选择——迭代特征选择

在单变量测试中&#xff0c;没有使用模型&#xff1b;在基于模型的选择中&#xff0c;使用单个模型来选择特征。而在迭代特征选择中&#xff0c;将会构造一系列模型&#xff0c;每个模型都使用不同数量的特征。有两种基本方法&#xff1a; 1、开始时没有特征&#xff0c;然后逐…

Django使用

一、安装Django 可以在创建好的虚拟环境中下载包 pip install Django3.2.20 -i https://pypi.tuna.tsinghua.edu.cn/simple 查看对应的下载好的内容 1、在Lib的site-packages第三方包里&#xff1a;这就是django框架源码 2、在scripts中有个 这是个工具&#xff0c;帮助创建d…

Java nio 的线程通信机制线程通信Pipe

Java的Pipe是一种新的线程通信机制&#xff0c;传统的线程通信可以是通过共享内存的方式&#xff0c;socket等方式&#xff0c;而Pipe是通过Java NIO 通信的方式实现共享内存&#xff0c;优点类似于go语言的管道 先上代码 public static void main(String[] args) throws IOEx…

Java网络编程(JavaWeb的基础)

Java网络编程&#xff08;JavaWeb的基础&#xff09; 文章目录 Java网络编程&#xff08;JavaWeb的基础&#xff09;前言一、网络编程概述1.1 软件架构&网络基础1.2 网络通信要素:IP/端口/通信协议1.3 传输层协议:tcp/udp 二、网络编程API2.1 InetAddress类2.2 Socket类&am…

DELL:利用大语言模型(LLM)生成评论与解释,革新虚假信息检测

ACL 2024 DELL: Generating Reactions and Explanations for LLM-Based Misinformation Detection https://arxiv.org/abs/2402.10426https://arxiv.org/abs/2402.10426 1.概述 大型语言模型(LLM)虽在诸多领域显示出色性能,但在直接应用于新闻真实性鉴别时,面临两大核心挑…

uboot基本使用网络命令和从服务器端下载linux内核启动

网络命令ip地址设置: setenv gmac_debug 0; setenv mdio_intf rgmii; setenv bootdelay 1; setenv ethaddr 00:xxxx:81:70; // mac地址 setenv ipaddr xxx; //开发板 IP 地址 setenv netmask 255.255.255.0; setenv gatewayip xxx.1; setenv serverip xxxx; //服…

潮玩手办盲盒前端项目模版的技术探索与应用案例

一、引言 在数字化时代&#xff0c;随着消费者对个性化和艺术化产品的需求日益增长&#xff0c;潮玩手办和盲盒市场逐渐崭露头角。为了满足这一市场需求&#xff0c;前端技术团队需要构建一个功能丰富、用户友好的在线平台。本文旨在探讨潮玩手办盲盒前端项目模版的技术实现&a…

图像处理Python库--图片裁剪、缩放、灰度图、圆角等

图像处理Python库 py-img-processor1. 安装2. 使用(Usage)2.1 运行配置2.2 图像处理处理函数图像处理参数为字符串图像处理参数为JSON 命令行提取图像主色调 py-img-processor Image editor using Python and Pillow. 依赖Pillow开发的Python库&#xff0c;用于图像编辑处理。…

第6章 复制

文章目录 前言1.配置1.1建立复制1.2断开复制1.3 安全性1.4 只读1.5 传输延迟 2. 拓扑2.1.一主一从结构2.2.一主多从结构2.3.树状主从结构 3.原理3.1复制过程 前言 复制功能&#xff0c;实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础&#xff0c;满足故障恢复和…

Redis 高可用 sentinel

简介 Sentinel提供了一种高可用方案来抵抗节点故障&#xff0c;当故障发生时Redis集群可以自动进行主从切换&#xff0c;程序可以不用重启。 Redis Sentinel集群可以看成是一个Zookeeper集群&#xff0c;他是Redis集群高可用的心脏&#xff0c;一般由3-5个节点组成&#xff0…

【STM32】GPIO复用和映射

1.什么叫管脚复用 STM32F4有很多的内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个GPIO作为内置外设使用的时候&#xff0c;就叫做复用。 STM32F4系列微控制器IO引脚通过一个…

鸿蒙开发HarmonyOS NEXT (二) 熟悉ArkUI

一、构造函数 构造一个商品类Item&#xff0c;然后利用foreach函数循环渲染 class Item {name: stringimage: ResourceStrprice: numberdiscount: numberconstructor(name: string, image: ResourceStr, price: number, discount: number 0) {this.name name;this.image ima…

MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解

MoneyPrinterPlus可以使用大模型自动生成短视频&#xff0c;我们可以借助Azure提供的语音服务来实现语音合成和语音识别的功能。 Azure的语音服务应该是我用过的效果最好的服务了&#xff0c;微软还得是微软。 很多小伙伴可能不知道应该如何配置&#xff0c;这里给大家提供一…

API-元素尺寸与位置

学习目标&#xff1a; 掌握元素尺寸与位置 学习内容&#xff1a; 元素尺寸与位置仿京东固定导航栏案例实现bilibili点击小滑块移动效果 元素尺寸与位置&#xff1a; 使用场景&#xff1a; 前面案例滚动多少距离&#xff0c;都是我们自己算的&#xff0c;最好是页面滚动到某个…

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述 在现代的分布式系统和实时数据处理领域&#xff0c;消息中间件扮演着关键的角色&#xff0c;用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中&#xff0c;Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特…

企业数据治理必备工具:智能元数据管理平台

当下&#xff0c;企业拥有海量数据&#xff0c;但仅拥有数据并不能释放数据价值。我们还需要深入了解数据的各种属性、来源和关系等信息。这些信息被称为“元数据”&#xff0c;即用于描述数据的数据。 假设&#xff0c;把我们每个人的身份证、户口本都当做数据&#xff0c;那…

模拟实现string【C++】

文章目录 全部的实现代码放在了文章末尾准备工作包含头文件定义命名空间和类类的成员变量 构造函数默认构造拷贝构造 重载赋值拷贝函数析构函数迭代器和获取迭代器迭代器获取迭代器 resize【调整size】图解 reserve【调整capacity】empty【判断串是否为空】operator[]appendpus…