神经网络的本质 逻辑回归 python的动态展示
- 逻辑回归运行图
- 相关代码
- 什么是逻辑回归
- 和ai的关系
- 逻辑回归公式流程与实际案例解析
- **一、逻辑回归的数学公式流程**
- 1. **线性组合阶段**
- 2. **激活函数(Sigmoid)**
- 3. **概率预测与决策**
- 4. **交叉熵损失函数**
- 5. **梯度下降优化**
- **二、实际案例:肿瘤良恶性预测**
- **1. 初始化参数**
- **2. 前向传播计算预测概率**
- **3. 计算交叉熵损失**
- **4. 计算梯度并更新参数**
- **5. 迭代优化**
- **6. 最终决策边界**
- **三、与代码的结合解析**
- **四、逻辑回归的本质与局限**
逻辑回归运行图
相关代码
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import time
from matplotlib.gridspec import GridSpec# 解决中文显示问题
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False# 生成模拟数据
np.random.seed(int(time.time()))
n_samples = 200
X = np.vstack([np.random.normal([-1, -1], 1, size=(n_samples, 2)),np.random.normal([1, 1], 1, size=(n_samples, 2))
])
y = np.hstack([np.zeros(n_samples), np.ones(n_samples)])# 激活函数
def sigmoid(x):return 1 / (1 + np.exp(-x))# 训练函数
def train(X, y, lr=0.01, epochs=300, save_every=10):n_samples, n_features = X.shapeW = np.random.randn(n_features)b = 0w_history = [W.copy()]b_history = [b]loss_history = []for epoch in range(epochs):linear_output = np.dot(X, W) + by_pred = sigmoid(linear_output)dW = (1 / n_samples) * np.dot(X.T, (y_pred - y))db = (1 / n_samples) * np.sum(y_pred - y)W -= lr * dWb -= lr * dbif epoch % save_every == 0:w_history.append(W.copy())b_history.append(b)loss = -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))loss_history.append(loss)print(f"Epoch {epoch}, Loss: {loss:.4f}")return w_history, b_history, loss_history# 预测函数
def predict(X, W, b):linear_output = np.dot(X, W) + by_pred = sigmoid(linear_output)return np.round(y_pred)# 动画更新函数(使用GridSpec管理布局)
def update(frame, w_history, b_history, X, y, gs):W = w_history[frame]b = b_history[frame]plt.clf()fig = plt.gcf()fig.set_size_inches(10, 8)# 主图:数据点和决策边界ax1 = fig.add_subplot(gs[0, :])ax1.scatter(X[y == 0, 0], X[y == 0, 1], c='blue', label='类别0', alpha=0.8)ax1.scatter(X[y == 1, 0], X[y == 1, 1], c='red', label='类别1', alpha=0.8)# 绘制决策边界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, 200), np.linspace(y_min, y_max, 200))Z = predict(np.c_[xx.ravel(), yy.ravel()], W, b)Z = Z.reshape(xx.shape)ax1.contourf(xx, yy, Z, alpha=0.3, cmap='viridis')ax1.contour(xx, yy, Z, colors='k', linewidths=1)ax1.set_xlabel('特征1', fontsize=12)ax1.set_ylabel('特征2', fontsize=12)ax1.set_title(f'逻辑回归训练过程 - 迭代 {frame * 10}', fontsize=14)ax1.legend()# 子图:损失曲线(使用GridSpec管理)ax2 = fig.add_subplot(gs[1, :])ax2.plot(range(len(loss_history))[1:], loss_history[1:], 'r-')ax2.set_title('损失曲线')ax2.set_xlabel('迭代 (x10)')ax2.set_ylabel('损失')ax2.grid(True)# 使用GridSpec后无需tight_layout# plt.tight_layout() # 取消此行# 训练模型
w_history, b_history, loss_history = train(X, y, lr=0.05, epochs=300, save_every=5)# 配置GridSpec布局
fig = plt.figure(figsize=(12, 10))
gs = GridSpec(2, 1, height_ratios=[3, 1], figure=fig) # 主图占3份,子图占1份# 创建动画
ani = FuncAnimation(fig, update,frames=len(w_history),fargs=(w_history, b_history, X, y, gs),interval=100,repeat=True
)plt.show()
plt.close('all')
什么是逻辑回归
Logistic regression
- 分类算法
- 用于二分类问题
- 核心是构建线性模型
- 使用sigmoid函数将线性输出映射到【0,1】区间
- 常用于垃圾邮件分析、风险控制、概率预测、特征分析
sigmoid函数可以很好的处理输入的异常数据,并将输出结果控制在【0,1】之间
线性回归使用 回归线和所有点之间的平方差进行判断
而对于逻辑回归使用了交叉熵损失;
和ai的关系
- AI 的基础组成部分:
人工智能的核心是让机器具备 “学习” 和 “决策” 能力,而逻辑回归作为最简单的机器学习算法之一,是 AI 领域的基础工具。它体现了 AI 中 “通过数据训练模型进行预测” 的核心思想。 - 可解释性 AI 的代表:
相比复杂的深度学习模型,逻辑回归的参数(权重和偏置)具有明确的物理意义,便于人类理解决策依据,因此在医疗、金融等对可解释性要求高的场景中不可或缺。 - 复杂 AI 系统的前置步骤:
在构建复杂 AI 系统时,逻辑回归常作为基线模型(Baseline Model),用于对比更复杂模型的效果,或作为特征工程的验证工具。
同时,逻辑回归本质就是单层神经网络,(仅有输入、输出层)
当神经网络仅有一个输出节点且使用sigmoid激活函数 == 逻辑回归
逻辑回归使用梯度下降法优化交叉熵损失,而神经网络使用了反向传播算法(扩展的梯度下降)优化损失;
逻辑回归公式流程与实际案例解析
一、逻辑回归的数学公式流程
1. 线性组合阶段
逻辑回归的基础是线性模型,首先对输入特征进行线性组合:
z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b = X·W + b
- X:输入特征向量(维度为n)
- W:权重向量(模型参数)
- b:偏置项(截距)
- z:线性组合的结果
2. 激活函数(Sigmoid)
线性组合的结果通过sigmoid函数映射到[0,1]区间,表示样本属于正类的概率:
σ(z) = 1 / (1 + e^(-z))
sigmoid函数的特性:
- 当z→+∞时,σ(z)→1(属于正类的概率高)
- 当z→-∞时,σ(z)→0(属于负类的概率高)
- 导数特性:σ’(z) = σ(z)(1-σ(z)),这对梯度计算很重要
3. 概率预测与决策
预测概率:
P(y=1|X) = σ(z) = 1 / (1 + e^(-X·W - b))
P(y=0|X) = 1 - σ(z)
决策规则:
y_pred = {1, if σ(z) ≥ 0.5; 0, otherwise}
4. 交叉熵损失函数
逻辑回归使用交叉熵作为损失函数,衡量预测概率与真实标签的差异:
单个样本损失:
L(ŷ, y) = -[y·log(ŷ) + (1-y)·log(1-ŷ)]m个样本的平均损失:
J(W, b) = -(1/m)∑[y⁽ⁱ⁾·log(ŷ⁽ⁱ⁾) + (1-y⁽ⁱ⁾)·log(1-ŷ⁽ⁱ⁾)]
- y:真实标签(0或1)
- ŷ:预测概率(σ(z))
5. 梯度下降优化
计算损失函数对参数的梯度:
dJ/dW = (1/m)∑(ŷ - y)·X
dJ/db = (1/m)∑(ŷ - y)
参数更新公式:
W = W - α·dJ/dW
b = b - α·dJ/db
- α:学习率
二、实际案例:肿瘤良恶性预测
下面以一个简化的肿瘤预测问题为例,演示逻辑回归的完整计算过程。
问题设定:
- 特征:肿瘤大小(cm)、细胞异型性评分(1-10)
- 标签:1(恶性),0(良性)
- 样本数据:3个训练样本
肿瘤大小(x₁) | 异型性评分(x₂) | 恶性(y) |
---|---|---|
2.5 | 7 | 1 |
1.8 | 4 | 0 |
3.2 | 8 | 1 |
1. 初始化参数
设初始权重和偏置为:
W = [0, 0]
b = 0
学习率α = 0.1
2. 前向传播计算预测概率
以第一个样本(2.5, 7)为例:
z = 0×2.5 + 0×7 + 0 = 0
ŷ = σ(0) = 1/(1+e^0) = 0.5
三个样本的预测概率:
- 样本1: ŷ=0.5
- 样本2: ŷ=0.5
- 样本3: ŷ=0.5
3. 计算交叉熵损失
单个样本损失:
- 样本1: -[1·log(0.5) + 0·log(0.5)] = -log(0.5) ≈ 0.693
- 样本2: -[0·log(0.5) + 1·log(0.5)] = -log(0.5) ≈ 0.693
- 样本3: -[1·log(0.5) + 0·log(0.5)] = -log(0.5) ≈ 0.693
平均损失:
J = (0.693 + 0.693 + 0.693)/3 ≈ 0.693
4. 计算梯度并更新参数
计算每个样本的(ŷ - y):
- 样本1: 0.5 - 1 = -0.5
- 样本2: 0.5 - 0 = 0.5
- 样本3: 0.5 - 1 = -0.5
计算梯度:
dJ/dW₁ = (1/3)[(-0.5)×2.5 + 0.5×1.8 + (-0.5)×3.2]= (1/3)[-1.25 + 0.9 - 1.6] = (1/3)(-1.95) = -0.65dJ/dW₂ = (1/3)[(-0.5)×7 + 0.5×4 + (-0.5)×8]= (1/3)[-3.5 + 2 - 4] = (1/3)(-5.5) ≈ -1.833dJ/db = (1/3)[-0.5 + 0.5 - 0.5] = (1/3)(-0.5) ≈ -0.167
参数更新:
W₁ = 0 - 0.1×(-0.65) = 0.065
W₂ = 0 - 0.1×(-1.833) = 0.1833
b = 0 - 0.1×(-0.167) = 0.0167
5. 迭代优化
重复前向传播、损失计算和梯度更新过程,直到损失收敛。假设经过100次迭代后,参数收敛到:
W = [0.8, 1.2]
b = -5.0
6. 最终决策边界
决策边界方程为:
0.8x₁ + 1.2x₂ - 5 = 0
当样本满足0.8x₁ + 1.2x₂ - 5 ≥ 0时,预测为恶性肿瘤;否则为良性。
三、与代码的结合解析
- 数据生成:创建两类二维数据点
- sigmoid函数:实现激活函数
- train函数:
- 初始化参数W和b
- 前向传播计算z和ŷ
- 计算交叉熵损失
- 计算梯度并更新参数
- 记录训练过程
代码中的核心公式对应关系:
linear_output = np.dot(X, W) + b
对应 z = X·W + by_pred = sigmoid(linear_output)
对应 ŷ = σ(z)loss = -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))
对应交叉熵损失dW = (1 / n_samples) * np.dot(X.T, (y_pred - y))
对应梯度计算
四、逻辑回归的本质与局限
逻辑回归本质上是通过线性模型拟合样本的对数几率(log-odds):
log(ŷ/(1-ŷ)) = X·W + b
这使得它能够处理概率意义上的分类问题。
局限性:
- 只能处理线性可分问题(通过特征工程可部分解决)
- 对异常值敏感
- 无法自动学习特征间的复杂交互
但作为基础模型,逻辑回归在工业界仍有广泛应用,尤其在需要可解释性的场景中(如金融风控、医疗诊断)。