机器学习·逻辑回归

前言

        逻辑回归虽然名称中有 “回归”,但实际上用于分类问题。基于线性回归的模型,通过使用逻辑函数(如 Sigmoid 函数)将线性组合的结果映射到0到1之间的概率值,用于表示属于某个类别的可能性。

一、逻辑回归 vs 线性回归

特性逻辑回归线性回归
任务类型分类(二分类为主)回归(预测连续值)
输出范围(0,1)(概率值)(-∞, +∞)
核心函数Sigmoid 函数线性函数
损失函数对数损失函数(交叉熵)均方误差(MSE)
优化目标最大化似然函数最小化预测误差平方和


二、核心数学原理

1. Sigmoid 函数
  • 公式
    \( \sigma(z) = \frac{1}{1 + e^{-z}} \)

  • 作用:将线性组合 \( z = w^T x \) 映射到 (0,1) 区间,表示概率。

  • 特性

    • 输出值可解释为样本属于正类的概率:\( P(y=1|x) = \sigma(w^T x) \)

    • 当 \( z = 0 \) 时,\( \sigma(z) = 0.5 \),为分类决策边界。

2. 损失函数(对数损失)
  • 公式
    \( J(w) = -\frac{1}{m} \sum_{i=1}^m [y^{(i)} \log(h_w(x^{(i)})) + (1-y^{(i)}) \log(1 - h_w(x^{(i)}))] \)

  • 特点

    • 凸函数,可通过梯度下降求全局最优解。

    • 惩罚预测概率与真实标签的偏离程度。

3. 梯度下降
  • 权重更新公式
    \( w \leftarrow w - \alpha \cdot \frac{1}{m} X^T (h_w(X) - y) \)

  • 关键参数

    • 学习率 \( \alpha \):控制步长,需调参避免震荡或收敛过慢。

    • 迭代次数:通常结合早停法(如 tol 参数)确定终止条件。


三、逻辑回归的 Python 实现

1. 手动实现核心代码
import numpy as npdef sigmoid(z):return 1 / (1 + np.exp(-z))def logistic_regression(X, y, lr=0.01, num_iter=10000):m, n = X.shapeX = np.concatenate((np.ones((m, 1)), X), axis=1)  # 添加截距项w = np.zeros(n + 1)for _ in range(num_iter):z = np.dot(X, w)h = sigmoid(z)gradient = np.dot(X.T, (h - y)) / mw -= lr * gradientreturn w
2. 决策边界可视化
import matplotlib.pyplot as plt# 假设 w 为训练得到的权重 [w0, w1, w2]
x1 = np.linspace(X[:,0].min(), X[:,0].max(), 100)
x2 = -(w[0] + w[1] * x1) / w[2]  # 解方程 w0 + w1x1 + w2x2 = 0plt.scatter(X[:,0], X[:,1], c=y)
plt.plot(x1, x2, 'r-')
plt.show()

四、Scikit-learn 实现

from sklearn.linear_model import LogisticRegression# 创建模型(带 L2 正则化)
model = LogisticRegression(penalty='l2', C=1.0, max_iter=1000)
model.fit(X_train, y_train)# 评估模型
print("准确率:", model.score(X_test, y_test))
print("权重:", model.coef_)
print("截距:", model.intercept_)

五、一些问题

1. 为什么逻辑回归叫“回归”?
  • 历史原因:虽然用于分类,但其数学形式继承自线性回归(通过线性组合 \( w^T x \) 建模)。

  • 本质区别:通过 Sigmoid 函数将线性输出映射为概率,解决分类问题。

2. 为什么使用对数损失而非均方误差?
  • 数学原因:均方误差在逻辑回归中会导致非凸优化问题,难以找到全局最优解。

  • 概率解释:对数损失直接衡量预测概率分布与真实分布的差异。

3. 逻辑回归的局限性
  • 线性决策边界:无法直接处理非线性可分数据(可通过引入多项式特征解决)。

  • 多分类扩展:需借助 One-vs-Rest 或 Softmax 回归(多分类逻辑回归)。


六、应用

  1. 二分类问题:如垃圾邮件检测、疾病诊断。

  2. 概率预测:如用户点击广告的概率、信用卡违约概率。

  3. 特征重要性分析:通过权重系数大小判断特征对结果的影响方向及程度。


七、完整代码+示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report# ======================
# 1. 生成模拟数据集
# ======================
X, y = make_classification(n_samples=500,  # 样本数量n_features=2,   # 特征数量n_redundant=0,  # 无冗余特征n_clusters_per_class=1,  # 每类样本聚集程度random_state=42
)
X = (X - X.mean(axis=0)) / X.std(axis=0)  # 标准化数据(提升梯度下降效率)# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# ======================
# 2. 手动实现逻辑回归
# ======================
class LogisticRegressionManual:def __init__(self, learning_rate=0.01, n_iters=1000):self.lr = learning_rateself.n_iters = n_itersself.weights = Noneself.bias = Noneself.loss_history = []def _sigmoid(self, z):return 1 / (1 + np.exp(-z))def fit(self, X, y):n_samples, n_features = X.shapeself.weights = np.zeros(n_features)self.bias = 0# 梯度下降优化for _ in range(self.n_iters):linear_model = np.dot(X, self.weights) + self.biasy_pred = self._sigmoid(linear_model)# 计算梯度dw = (1 / n_samples) * np.dot(X.T, (y_pred - y))db = (1 / n_samples) * np.sum(y_pred - y)# 更新参数self.weights -= self.lr * dwself.bias -= self.lr * db# 记录损失loss = -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))self.loss_history.append(loss)def predict_proba(self, X):linear_model = np.dot(X, self.weights) + self.biasreturn self._sigmoid(linear_model)def predict(self, X, threshold=0.5):return (self.predict_proba(X) >= threshold).astype(int)# 训练手动实现的模型
manual_model = LogisticRegressionManual(learning_rate=0.1, n_iters=2000)
manual_model.fit(X_train, y_train)# ======================
# 3. Scikit-learn实现
# ======================
sklearn_model = LogisticRegression(penalty='none', solver='lbfgs', max_iter=2000)
sklearn_model.fit(X_train, y_train)# ======================
# 4. 结果可视化
# ======================
def plot_decision_boundary(model, X, y, title):x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100),np.linspace(y_min, y_max, 100))# 预测网格点Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap='coolwarm')plt.title(title)plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.figure(figsize=(12, 5))plt.subplot(1, 2, 1)
plot_decision_boundary(manual_model, X_train, y_train, 'Manual Logistic Regression')plt.subplot(1, 2, 2)
plot_decision_boundary(sklearn_model, X_train, y_train, 'Scikit-learn Logistic Regression')plt.tight_layout()
plt.show()# ======================
# 5. 模型评估
# ======================
# 手动模型评估
y_pred_manual = manual_model.predict(X_test)
print("手动实现模型评估:")
print(f"准确率: {accuracy_score(y_test, y_pred_manual):.4f}")
print(classification_report(y_test, y_pred_manual))# Scikit-learn模型评估
y_pred_sklearn = sklearn_model.predict(X_test)
print("\nScikit-learn模型评估:")
print(f"准确率: {accuracy_score(y_test, y_pred_sklearn):.4f}")
print(classification_report(y_test, y_pred_sklearn))# ======================
# 6. 损失函数变化曲线
# ======================
plt.figure(figsize=(8, 5))
plt.plot(manual_model.loss_history, label='Training Loss')
plt.xlabel('Iterations')
plt.ylabel('Loss')
plt.title('Loss During Training (Manual Implementation)')
plt.legend()
plt.show()
  1. Sigmoid函数:将线性输出映射到(0,1)区间,表示概率。

  2. 对数损失函数:衡量预测概率与真实标签的差异。

  3. 梯度下降:通过计算损失函数的梯度更新模型参数。

  4. 决策边界:由权重和偏置定义的超平面,将不同类别分开。

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

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

相关文章

deepseek-r1 训练流程

deepseek-r1 训练流程 技术创新deepseek-v3 && deepseek-r1deepseek-r1-zero训练过程aha moment准确度提升思考时间增加 deepseek-r1冷启动推理场景强化学习数据采样&&SFT全场景强化学习结果 参考文献 技术创新 极致的成本控制,媲美openAI的性能&a…

网络工程师 (35)以太网通道

一、概念与原理 以太网通道,也称为以太端口捆绑、端口聚集或以太链路聚集,是一种将多个物理以太网端口组合成一个逻辑通道的技术。这一技术使得多个端口能够并行工作,共同承担数据传输任务,从而提高了网络的传输能力和可靠性。 二…

win11电脑其他WiFi可以连,只有一个WiFi连不上

这个问题卡了一小会,查了一些资料 后面发现 点击“诊断网络问题” 显示没有响应 第一步 重启wlan网络适配器 解决!!! 重新连接那个有问题的wifi,丝滑连接!

【网络通信】传输层之UDP协议

【网络通信】传输层之UDP协议 传输层端对端通信实现端到端通信的关键技术 UDP协议再谈端口号端口号划分关于端口号的两个问题 UDP协议基本格式UDP通信的特点UDP的缓冲区UDP数据报的最大长度基于UDP的应用层协议如何封装UDP报文以及如何交付UDP报文进一步理解封装和解包 传输层 …

时间盲注、boolen盲注

获取当前数据库名 获取数据库表 获取表的列

2025_2_13 二叉搜索树(一)

1.完全二叉树和满二叉树的概念 满二叉树:每一层都达到最大值 完全二叉树:只能右下角空,其他位置满,即最后一排从左到右的中间不能由缺 2.二叉搜索树 左子树中所有结点的 key 值都比根结点的 key 值小,并且左子树也…

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展,大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世,为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲!!! 目录 一、…

高速差分总线比较--RS422, LVDS,PECL

1. RS422A, 如RS422 & RS485总先, 0/5V的差分电平,匹配电阻120ohm. S2D, Transmitter D2S, Receiver LVDS 如SN65LVDS1,驱动器:DS90LV031(支持预加重),接收器&…

idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448

idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…

Java中如何高效地合并多个对象的List数据:方法与案例解析!

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互…

23、深度学习-自学之路-激活函数relu、tanh、sigmoid、softmax函数的正向传播和反向梯度。

在使用这个非线性激活函数的时候,其实我们重点还是学习的是他们的正向怎么传播,以及反向怎么传递的。 如下图所示: 第一:relu函数的正向传播函数是:当输入值(隐藏层)值大于了,就输出…

React源码揭秘 | scheduler 并发更新原理

React 18增加了并发更新特性,开发者可以通过useTransition等hooks延迟执行优先级较低的更新任务,以达到页面平滑切换,不阻塞用户时间的目的。其实现正是依靠scheduler库。 scheduler是一个依赖时间片分片的任务调度器,React团队将…

腿足机器人之二- 运动控制概览

腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件,关节不仅需要通过机械设计实现复杂的运动能力,还必须通过电子组件和控制系统来精确控制这些运动。…

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略

一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…

软件项目估算偏差的5 大源头及解决方案

软件项目成本估算偏差往往导致资金紧张,资源投入受限,进度延误无法按时交付,为控制成本还可能牺牲质量,引发团队士气低落、客户不满,严重时项目直接失败 。 因此,及时解决或降低项目偏差就非常重要&#xf…

树莓派学习

树莓派4B 基础操作 开机 开机要主要先接好线再通电 关机 先在系统里面关机再断电 可以在界面里面点击关机,或者使用命令行 使用网线连接到树莓派 用笔记本的以太网口接线到树莓派 在网络连接里面打开WLAN的网络共享,共享选择以太网口 在cmd里面输…

Jenkins 新建配置 Freestyle project 任务 六

Jenkins 新建配置 Freestyle project 任务 六 一、新建任务 在 Jenkins 界面 点击 New Item 点击 Apply 点击 Save 回到任务主界面 二、General 点击左侧 Configure Description:任务描述 勾选 Discard old builds Discard old builds:控制何时…

一场始于 Selector Error 的拯救行动:企查查数据采集故障排查记

时间轴呈现事故进程 17:00:开发人员小李正在尝试利用 Python 爬虫从企查查(https://www.qcc.com)抓取公司工商信息。原本一切正常,但突然发现信息采集失败,程序抛出大量选择器错误。17:15:小李发现&#x…

HCIA项目实践---OSPF的基本配置

9.5.12 OSPF的基本配置 (所搭环境如上图所示) A 先配置IP地址 (先进入路由器R1的0/0/0接口配置IP地址,再进入环回接口配置IP地址) (配置R2路由器的0/0/0和0/0/1以及环回接口的IP地址) (置R3路由器的0/0/0接…

Java练习(20)

ps:练习来自力扣 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 class Solution {pu…