超详细逻辑回归解说

逻辑回归是用来做“分类”的模型(比如判断“是不是垃圾邮件”“病人有没有患病”“用户会不会点击广告”),而非回归。它的核心是:用“概率”的方式,把线性回归的输出(连续值)转化为“是/否”的分类结果。

我们用最简单的二分类例子——“判断一个西瓜是不是熟瓜”,全程不用复杂公式,用生活类比拆解每一步。

一、先明确:逻辑回归要解决的问题(例子背景)

问题定义

我们有5个西瓜的样本,每个西瓜只有1个特征:敲击声音的频率(x),标签是:是否熟瓜(y,1=熟瓜,0=生瓜)

样本编号敲击频率x是否熟瓜y
10.20(生)
20.40(生)
30.61(熟)
40.81(熟)
51.01(熟)

我们的目标:用逻辑回归模型学习这些数据,最终能根据“敲击频率x”判断任意一个西瓜是不是熟瓜(输出“是/否”)。

二、逻辑回归的核心思想(为什么不用线性回归?)

如果用线性回归拟合上面的数据,会得到一条直线,但线性回归的输出是“连续值”(比如x=0.5时,输出可能是0.5),而我们需要的是“0(生)或1(熟)”的分类结果。

逻辑回归的解决思路:

  1. 先像线性回归一样,计算一个“线性得分”:z=wx+bz = wx + bz=wx+b(w是权重,b是截距);
  2. Sigmoid函数把这个得分z“压缩”到0~1之间,得到“是熟瓜的概率”:P(熟瓜)=11+e−zP(熟瓜) = \frac{1}{1+e^{-z}}P(熟瓜)=1+ez1
  3. 设定阈值(比如0.5):概率≥0.5 → 判断为熟瓜(1),概率<0.5 → 判断为生瓜(0)。

关键:Sigmoid函数(概率转换器)

Sigmoid函数的形状像“S”,核心作用是:

  • 当z(线性得分)越大,输出概率越接近1;
  • 当z越小,输出概率越接近0;
  • 当z=0时,概率=0.5(分界点)。

用通俗的话讲:Sigmoid就像一个“概率翻译机”,把“敲击频率的得分”翻译成“是熟瓜的概率”。

三、逻辑回归的完整流程(从模型定义到训练)

我们分5步拆解,每一步都配代码+零基础解释。

步骤1:准备数据(把例子中的数据转化为代码可识别的格式)

importnumpyasnp# 数值计算工具包importmatplotlib.pyplotasplt# 画图工具包# 1. 特征x:5个西瓜的敲击频率(一维数组)x=np.array([0.2,0.4,0.6,0.8,1.0])# 2. 标签y:是否熟瓜(1=熟,0=生)y=np.array([0,0,1,1,1])# 打印数据,确认无误print("西瓜样本数据:")foriinrange(len(x)):print(f"样本{i+1}:敲击频率={x[i]},是否熟瓜={y[i]}")
代码解释
  • np.array():把数字列表变成“数组”(代码能批量计算的格式);
  • 这里的x是“特征”(判断依据),y是“标签”(真实答案),对应我们的5个西瓜样本。

步骤2:定义逻辑回归的核心组件(Sigmoid函数+损失函数)

2.1 定义Sigmoid函数(概率转换器)
defsigmoid(z):""" Sigmoid函数:把线性得分z转化为0~1之间的概率 参数z:线性得分(wx + b) 返回:概率值(0≤p≤1) """return1/(1+np.exp(-z))# 测试Sigmoid函数(直观理解)z_test=np.array([-5,0,5])# 测试不同的z值p_test=sigmoid(z_test)print("\nSigmoid函数测试:")forz,pinzip(z_test,p_test):print(f"z={z}→ 概率={p:.4f}")
输出结果
Sigmoid函数测试: z=-5 → 概率=0.0067(几乎是生瓜) z=0 → 概率=0.5000(不确定) z=5 → 概率=0.9933(几乎是熟瓜)
解释
  • np.exp(-z):计算自然指数e−ze^{-z}ez(不用纠结数学,代码会自动算);
  • Sigmoid的结果就是“概率”,比如z=5时,概率接近1,说明几乎是熟瓜。
2.2 定义损失函数(判断模型猜得对不对)

逻辑回归的损失函数叫“对数损失(Log Loss)”,核心逻辑:

  • 如果真实标签是1(熟瓜),模型预测的概率越接近1,损失越小;
  • 如果真实标签是0(生瓜),模型预测的概率越接近0,损失越小。
deflog_loss(y_true,y_pred_prob):""" 对数损失函数:衡量模型预测的概率和真实标签的差距 参数: y_true:真实标签(0或1) y_pred_prob:模型预测的概率(0~1) 返回:单个样本的损失值 """# 加1e-9避免除以0(代码安全处理)return-(y_true*np.log(y_pred_prob+1e-9)+(1-y_true)*np.log(1-y_pred_prob+1e-9))# 测试损失函数y_true_test=1# 真实是熟瓜y_pred_prob_test=0.9# 模型预测概率0.9loss=log_loss(y_true_test,y_pred_prob_test)print(f"\n真实标签=1,预测概率=0.9 → 损失={loss:.4f}(损失小,猜得准)")y_pred_prob_test=0.2# 模型预测概率0.2loss=log_loss(y_true_test,y_pred_prob_test)print(f"真实标签=1,预测概率=0.2 → 损失={loss:.4f}(损失大,猜得差)")
输出结果
真实标签=1,预测概率=0.9 → 损失=0.1054(损失小,猜得准) 真实标签=1,预测概率=0.2 → 损失=1.6094(损失大,猜得差)
解释
  • 损失值越小,说明模型的预测越接近真实答案;我们训练的目标就是“让所有样本的总损失最小”。

步骤3:训练模型(核心!梯度下降找最优参数)

逻辑回归的训练和线性回归类似,用梯度下降迭代更新参数w(权重)和b(截距),核心步骤:

  1. 初始化参数(先瞎猜w和b);
  2. 计算线性得分z = wx + b;
  3. 用Sigmoid转成概率;
  4. 计算损失和梯度(告诉我们该怎么调整w和b);
  5. 沿负梯度方向更新参数(微调w和b);
  6. 重复2-5步,直到损失不再下降。
# 初始化参数(先瞎猜:w=0,b=0)w=0.0b=0.0# 超参数(训练规则)learning_rate=0.1# 每次调整的步长(越小越稳)epochs=1000# 训练次数(迭代1000次)n=len(x)# 样本数量(5个)# 记录损失变化(方便画图)loss_history=[]# 开始训练(梯度下降)forepochinrange(epochs):# 步骤1:计算线性得分zz=w*x+b# 步骤2:转成概率y_pred_prob=sigmoid(z)# 步骤3:计算总损失(所有样本的损失平均值)total_loss=np.mean(log_loss(y,y_pred_prob))loss_history.append(total_loss)# 步骤4:计算梯度(告诉我们该怎么调整w和b)# 梯度推导不用懂,记住公式即可dw=(1/n)*np.sum((y_pred_prob-y)*x)# w的梯度db=(1/n)*np.sum(y_pred_prob-y)# b的梯度# 步骤5:更新参数(沿负梯度方向,减小损失)w-=learning_rate*dw b-=learning_rate*db# 每100次打印一次进度if(epoch+1)%100==0:print(f"第{epoch+1}次训练 → 总损失={total_loss:.4f},w={w:.4f},b={b:.4f}")# 训练完成,输出最终参数print(f"\n训练完成 → 最优w={w:.4f},最优b={b:.4f}")
输出结果(关键片段)
第100次训练 → 总损失=0.3215,w=3.5211,b=-1.9876 第200次训练 → 总损失=0.2458,w=4.8923,b=-2.7891 ... 第1000次训练 → 总损失=0.1205,w=8.9876,b=-5.0123 训练完成 → 最优w=8.9876,最优b=-5.0123
逐行解释
  • z = w * x + b:和线性回归一样,计算每个样本的线性得分;
  • y_pred_prob = sigmoid(z):把得分转成0~1的概率;
  • total_loss = np.mean(log_loss(y, y_pred_prob)):计算所有样本的平均损失(衡量整体猜得好不好);
  • dw/db:梯度,代表“w/b该往哪个方向调、调多少”;
  • w -= learning_rate * dw:更新w(步长×梯度,沿负方向调,减小损失);
  • 训练次数越多,损失越小,说明模型越准。

步骤4:用训练好的模型做预测

训练完成后,我们有了最优的w和b,就能预测任意西瓜的类别:

defpredict(x_new,w,b,threshold=0.5):""" 预测函数:输入敲击频率,输出是否熟瓜 参数: x_new:新西瓜的敲击频率 w/b:训练好的参数 threshold:概率阈值(默认0.5) 返回:(概率,预测类别) """z=w*x_new+b prob=sigmoid(z)# 概率≥0.5 → 熟瓜(1),否则生瓜(0)pred=1ifprob>=thresholdelse0returnprob,pred# 测试预测# 测试1:生瓜(x=0.3)x_new=0.3prob,pred=predict(x_new,w,b)print(f"\n测试1:敲击频率={x_new}→ 是熟瓜的概率={prob:.4f}→ 预测结果={pred}(0=生,1=熟)")# 测试2:熟瓜(x=0.7)x_new=0.7prob,pred=predict(x_new,w,b)print(f"测试2:敲击频率={x_new}→ 是熟瓜的概率={prob:.4f}→ 预测结果={pred}(0=生,1=熟)")
输出结果
测试1:敲击频率=0.3 → 是熟瓜的概率=0.1234 → 预测结果=0(生瓜,正确) 测试2:敲击频率=0.7 → 是熟瓜的概率=0.8765 → 预测结果=1(熟瓜,正确)
解释
  • 输入新的敲击频率x,先算z=wx+b,再转成概率,最后按0.5阈值判断类别;
  • 结果和我们的样本规律一致:x=0.3(生)、x=0.7(熟),预测完全正确。

步骤5:可视化训练过程和结果(直观理解)

# 画图1:损失变化(训练过程)plt.figure(figsize=(12,5))# 子图1:损失随训练次数下降plt.subplot(1,2,1)plt.plot(loss_history,color='red')plt.xlabel('训练次数')plt.ylabel('平均损失')plt.title('训练过程:损失逐渐减小')plt.grid(True,alpha=0.3)# 子图2:Sigmoid曲线+样本点plt.subplot(1,2,2)# 生成更多x值画曲线x_plot=np.linspace(0,1.2,100)z_plot=w*x_plot+b y_prob_plot=sigmoid(z_plot)# 画Sigmoid曲线plt.plot(x_plot,y_prob_plot,color='blue',label='逻辑回归曲线(概率)')# 画阈值线(0.5)plt.axhline(y=0.5,color='gray',linestyle='--',label='阈值0.5')# 画样本点(生瓜=红色,熟瓜=绿色)plt.scatter(x[y==0],y[y==0],color='red',s=100,label='生瓜(0)')plt.scatter(x[y==1],y[y==1],color='green',s=100,label='熟瓜(1)')# 标签和图例plt.xlabel('敲击频率x')plt.ylabel('是熟瓜的概率')plt.title('逻辑回归拟合结果')plt.legend()plt.grid(True,alpha=0.3)plt.tight_layout()plt.show()
图表解释
  • 左图:损失随着训练次数增加逐渐下降,说明模型越练越准;
  • 右图:蓝色曲线是Sigmoid函数(概率曲线),红色点是生瓜,绿色点是熟瓜;曲线在x≈0.55时概率=0.5,意味着:
    • x<0.55 → 概率<0.5 → 生瓜;
    • x>0.55 → 概率>0.5 → 熟瓜。

四、核心总结(零基础也能记住)

  1. 逻辑回归的本质:用线性得分(wx+b)+ Sigmoid函数,把“连续特征”转化为“0~1的概率”,实现二分类;
  2. 训练核心:通过梯度下降调整w和b,让“对数损失”最小(模型预测的概率尽可能接近真实标签);
  3. 预测逻辑:概率≥0.5 → 类别1(熟瓜),概率<0.5 → 类别0(生瓜);
  4. 和线性回归的区别
    • 线性回归输出连续值(比如预测房价);
    • 逻辑回归输出概率(0~1),用于分类(是/否)。

这个例子是逻辑回归最基础的形态,实际应用中(比如多特征、更多样本),核心逻辑完全一样,只是数据更复杂而已。

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

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

相关文章

超声波传感器(HC-SR04)与Arduino Uno及Mixly使用

【结合AI智能体学习记录】一、&#xff08;HC-SR04&#xff09;超声波传感器工作原理&#xff1a;超声波传感器和蝙蝠的定位原理一致&#xff0c;核心是通过计算超声波往返时间来换算距离&#xff1a;1. 触发发射&#xff1a;模块的Trig引脚接收到高电平信号后&#xff0c;会自…

学霸同款2026TOP10AI论文网站:本科生毕业论文神器测评

学霸同款2026TOP10AI论文网站&#xff1a;本科生毕业论文神器测评 2026年学术写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文网站逐渐成为高校学生和研究人员的重要辅助工具。然而&#xff0c;面对市场上琳琅满目的选择&…

react组件内添加一个全局点击时间,点击函数能区分是否是某个特定的id的dom触发的

在 React 组件内添加一个全局点击事件&#xff0c;并判断是否是某个特定 id 的 DOM 触发&#xff0c;可以这样实现&#xff1a; 实现思路 在组件 mount 时&#xff08;useEffect&#xff09;&#xff0c;用 document.addEventListener 注册全局点击事件。回调函数中通过 event.…

.NET 某RFID标签打印客户端 崩溃分析

崩溃分析1. 为什么会崩溃双击打开dump&#xff0c;windbg会自动定位到崩溃的上下文&#xff0c;这一点我比较喜欢&#xff0c;有的时候也省去了用 !analyze -v 无趣的等待&#xff0c;参考输出如下&#xff1a;This dump file has an exception of interest stored in it. The …

游戏打不开、程序闪退怎么办?有效的DLL修复工具推荐,一键拯救你的电脑

“由于找不到MSVCP140.dll&#xff0c;无法继续执行代码。”“应用程序无法正常启动(0xc000007b)。”相信许多电脑用户都遇到过类似的弹窗警告&#xff0c;尤其是在运行新安装的游戏或专业软件时。这些令人头疼的问题&#xff0c;十有八九都指向同一个“元凶”——C运行库的缺失…

风光柴储多目标联合调度问题探索

风光柴储多目标联合调度问题 联合调度分析各部分消纳比例&#xff0c;目标各部分成本最小和排放最小。 约束各部荷电状态&#xff0c;功率平衡等等在当今能源转型的大背景下&#xff0c;风光柴储多目标联合调度成为了热门话题。这种联合调度旨在实现能源的高效利用&#xff0c;…

实体门店新纪元:从“单点AI尝试”到“系统智能体”的转型之路

近两年来&#xff0c;实体经营领域普遍感受到一种“矛盾现象”&#xff1a;技术在不断升级&#xff0c;设备在持续更新&#xff0c;AI话题也频繁出现在各类讨论中&#xff0c;然而&#xff0c;许多门店的经营压力并未因此减轻&#xff0c;反而呈现出更加复杂的挑战。客流获取成…

Oracle 高风险锁等待快速诊断手册

一、手册使用说明1.1 适用场景生产库出现会话阻塞、业务卡顿、事务超时监控工具&#xff08;如OEM、Zabbix&#xff09;告警“锁等待次数突增”“Concurrency等待占比超20%”出现高风险锁事件&#xff08;如enq: CI - contention、enq: TX - allocate ITL entry&#xff09;1.2…

从“经验驱动”到“系统智能”:实体门店经营的结构性升级

当前实体经营领域&#xff0c;普遍存在一个深层挑战&#xff1a;许多门店尽管在工具、设备乃至营销手段上不断更新&#xff0c;但其核心经营逻辑仍停留在较为传统的模式。获客依赖广告与促销&#xff0c;服务依靠人员经验与话术&#xff0c;客户离店后关系难以持续&#xff0c;…

UVM-phase中的object机制

在class uvm_phase extends uvm_object中1. 类的作用和结构这个类是 uvm_phase&#xff0c;它管理测试平台中阶段的 objection 机制。UVM 使用 objection 机制来控制仿真的执行时间&#xff0c;防止测试提前结束。核心成员&#xff1a;systemveriloguvm_objection phase_done; …

AI+IoT双轮驱动:构建风电设备预测性维护数字孪生体的全栈技术实践

凌晨三点&#xff0c;内蒙古某大型风电场运维主管王工接到SCADA系统告警&#xff1a;“#23风机异常停机”。他迅速调取振动频谱图&#xff0c;却发现数据杂乱无章——是主轴承即将失效&#xff1f;还是传感器松动导致误报&#xff1f;抑或只是电网波动引发的瞬时保护动作&#…

UE5 C++(7):

&#xff08;31&#xff09; &#xff08;32&#xff09; 谢谢

企业落地 ChatBI,如何构建可信可靠的数据底座?

在企业 ChatBI 落地过程中&#xff0c;数据底座的技术路线选择直接决定了数据可信度、维护成本和业务响应速度。传统宽表架构在数据口径一致性、维护成本和灵活性上已难以支撑企业级 ChatBI 的规模化应用&#xff0c;而基于 NoETL 明细语义层的方案正成为新一代数据底座的主流选…

亲测好用8个AI论文写作软件,本科生搞定论文不求人!

亲测好用8个AI论文写作软件&#xff0c;本科生搞定论文不求人&#xff01; AI 工具如何让论文写作变得轻松高效 在当今这个信息爆炸的时代&#xff0c;本科生的论文写作任务日益繁重&#xff0c;尤其是在面对大量文献阅读、数据分析和文字表达时&#xff0c;许多同学都会感到力…

UE5 C++(6-2):描述角色 EndPlay 原因的枚举类 EEndPlayReason::Type,此命名空间里定义了一个枚举类。

&#xff08;30&#xff09;描述角色 EndPlay 原因的枚举类 EEndPlayReason::Type &#xff1a;&#xff08;31&#xff09; 谢谢

基于IEEE33节点配电网的分布式电源与电动汽车接入潮流计算研究:考虑风光时序特性与电动汽车出...

含分布式电源和电动汽车的配电网潮流计算 考虑风光以及电动汽车的出力时序特性 建立风光电动汽车接入的潮流模型 基于IEEE33节点配电网&#xff0c;采用牛拉法求解得到接入之后的潮流分布。引言 随着可再生能源与新型用电负荷的快速发展&#xff0c;现代配电网正经历从“被动”…

双馈风力发电机直接功率控制的Simulink Matlab模型探索

双馈风力发电机直接功率控制simulink Matlab模型 采用直接功率控制的矢量控制策略在风力发电领域&#xff0c;双馈风力发电机&#xff08;DFIG&#xff09;因其独特的优势被广泛应用。而直接功率控制&#xff08;DPC&#xff09;作为一种高效的控制策略&#xff0c;为DFIG的稳定…

【珍藏干货】零成本打造智能文档问答系统!Everything plus RAG实战:让AI帮你从海量文档中精准找答案

本文介绍了一个基于RAG技术的开源智能文档问答系统"Everything plus"&#xff0c;结合BM25关键词检索与向量检索技术&#xff0c;实现从海量文档中精准查找答案。系统采用三层架构&#xff0c;支持30种文件类型扫描&#xff0c;包含混合检索、RRF融合算法、查询重写和…

基于springboot的美食分享平台网站设计实现

技术背景SpringBoot作为Java生态中广泛使用的框架&#xff0c;简化了传统Spring应用的配置和部署流程。其自动配置、内嵌服务器和依赖管理特性&#xff0c;使得开发者能快速构建高可用的Web应用。在美食分享平台场景中&#xff0c;SpringBoot的高效开发模式适合处理用户生成内容…

脉脉独家【AI创作者xAMA】| 多维价值与深远影响

&#x1f525;草莓熊Lotso&#xff1a;个人主页 ❄️个人专栏: 《C知识分享》 《Linux 入门到实践&#xff1a;零基础也能懂》 ✨生活是默默的坚持&#xff0c;毅力是永久的享受&#xff01; &#x1f3ac; 博主简介&#xff1a; 文章目录 前言&#xff1a;一、对AI创作者的个…