Python神经网络编程(一):预测器、分类器与神经网络基础概念 Python神经网络编程一预测器、分类器与神经网络基础概念本文是《Python神经网络编程》系列博客的第1篇基于真实服务器实操输出涵盖实验1-2的所有内容。服务器环境Ubuntu 24.04 / Python 3.12.3 / NumPy 2.5.1 / Matplotlib 3.11.0服务器华为云 ecs-1f62-0001 (120.46.93.164)目录你将学到什么实验1预测器与分类器实验2多分类器与神经网络总结下一篇预告你将学到什么在本篇博客中你将通过从零开始的数学推导和Python代码实操理解神经网络的核心概念预测器Predictor线性回归如何工作分类器Classifier从回归到分类的跨越线性分类器的局限性为什么XOR问题无法用一条直线解决激活函数Activation Function给神经网络引入非线性神经网络的结构从单层到多层从线性到非线性实验1预测器与分类器1.1 人工智能的概念人工智能Artificial Intelligence, AI的本质是让机器能够模拟人类的智能行为包括学习、推理、感知和决策。神经网络是人工智能的一个重要分支它受到生物神经网络的启发生物神经网络 人工神经网络 ┌──────────┐ ┌──────────┐ │ 神经元 │ │ 节点 │ │ (Neuron) │ ←类比→ │ (Node) │ └──────────┘ └──────────┘ │ │ ▼ ▼ 树突接收信号 加权求和 激活函数 轴突传递信号 输出到下一层1.2 预测机Predictor预测器是一个简单的数学模型用于根据输入预测输出。核心公式y w × x b其中x输入特征y输出预测值w权重weight表示输入对输出的影响程度b偏置bias表示当输入为0时的输出Python实现简单线性预测器importnumpyasnp# 简单线性预测器defpredict(x,w,b):简单的线性预测器returnw*xb# 示例根据学习时间预测考试分数# 训练数据(学习时间, 考试分数)training_data[[1.0,35.0],[2.0,48.0],[3.0,62.0],[4.0,75.0],[5.0,85.0],[6.0,92.0]]# 使用最小二乘法计算权重w和偏置b# 公式w Σ((x_i - x_mean)(y_i - y_mean)) / Σ((x_i - x_mean)²)# b y_mean - w * x_meanxnp.array([d[0]fordintraining_data])ynp.array([d[1]fordintraining_data])x_meannp.mean(x)y_meannp.mean(y)wnp.sum((x-x_mean)*(y-y_mean))/np.sum((x-x_mean)**2)by_mean-w*x_meanprint(f训练数据:{training_data})print(f计算得到: w {w:.4f}, b {b:.4f})print(f预测函数: y {w:.4f}* x {b:.4f})# 预测fortest_xin[3.5,7,8]:pred_ypredict(test_x,w,b)print(f 学习{test_x}小时 - 预测分数:{pred_y:.1f})服务器真实输出训练数据: [[1.0, 35.0], [2.0, 48.0], [3.0, 62.0], [4.0, 75.0], [5.0, 85.0], [6.0, 92.0]] 计算得到: w 11.6857, b 25.2667 预测函数: y 11.6857 * x 25.2667 学习 3.5 小时 - 预测分数: 66.2 学习 7 小时 - 预测分数: 107.1 学习 8 小时 - 预测分数: 118.8最小二乘法推导目标找到一条直线y wx b使得所有样本点到直线的垂直距离平方和最小。误差函数Loss FunctionE Σ(y_i - (w × x_i b))²求解对w和b求偏导令偏导为0∂E/∂w -2 × Σ(y_i - w×x_i - b) × x_i 0 ∂E/∂b -2 × Σ(y_i - w×x_i - b) 0解方程组得到w Σ((x_i - x_mean)(y_i - y_mean)) / Σ((x_i - x_mean)²) b y_mean - w × x_mean1.3 分类机Classifier分类器将输入映射到离散的类别标签而不是连续值。从预测到分类预测器的输出是连续值如分数 66.2而分类器的输出是类别如及格/“不及格”。方法设置一个阈值threshold将连续输出转换为类别。# 简单分类器defclassify(score,threshold60):根据分数判断是否及格return及格ifscorethresholdelse不及格# 测试forhoursin[1,2,3,4,5,6]:scorepredict(hours,w,b)labelclassify(score)print(f 学习{hours}小时, 分数{score:.0f}-{label})服务器真实输出学习 1 小时, 分数 35 - 不及格 学习 2 小时, 分数 48 - 不及格 学习 3 小时, 分数 62 - 及格 学习 4 小时, 分数 75 - 及格 学习 5 小时, 分数 85 - 及格 学习 6 小时, 分数 92 - 及格实验2多分类器与神经网络2.1 线性分类器的局限线性分类器只能用一个**超平面在2D中是直线**来划分两类数据。XOR问题线性不可分XOR异或是一个经典的线性不可分问题输入A输入BXOR输出000011101110在2D平面上XOR的输出分布如下B1 │ 1 0 │ B0───┼───B1 │ │ 0 1 B0 A0 A1无法用一条直线将1和0分开这就是线性分类器的局限性。可视化线性分类器的局限图1线性分类器无法用一条直线将XOR的两类分开2.2 激活函数的意义激活函数Activation Function是神经网络的灵魂它引入了非线性使得神经网络可以拟合任意复杂的函数。常见激活函数激活函数公式输出范围特点Step0 if x0 else 1{0, 1}最早使用不可导Sigmoid1 / (1 e^(-x))(0, 1)平滑可导梯度消失Tanh(e^x - e^(-x)) / (e^x e^(-x))(-1, 1)零中心梯度消失ReLUmax(0, x)[0, ∞)计算简单缓解梯度消失Python实现激活函数对比importnumpyasnpimportmatplotlib.pyplotaspltdefsigmoid(x):return1/(1np.exp(-x))deftanh(x):returnnp.tanh(x)defrelu(x):returnnp.maximum(0,x)defstep(x):returnnp.where(x0,1,0)# 测试各激活函数x_values[-2,-1,0,1,2]print(f{x:4}|{Sigmoid:12}|{Tanh:12}|{ReLU:12}|{Step:10})print(-*60)forxinx_values:ssigmoid(x)ttanh(x)rrelu(x)ststep(x)print(f{x:4}|{s:12.4f}|{t:12.4f}|{r:12.4f}|{st:10.0f})服务器真实输出x | Sigmoid | Tanh | ReLU | Step ------------------------------------------------------------ -2 | 0.1192 | -0.9640 | 0.0000 | 0 -1 | 0.2689 | -0.7616 | 0.0000 | 0 0 | 0.5000 | 0.0000 | 0.0000 | 1 1 | 0.7311 | 0.7616 | 1.0000 | 1 2 | 0.8808 | 0.9640 | 2.0000 | 1可视化激活函数对比图24种常见激活函数的曲线对比2.3 神经网络的起源神经网络的灵感来自于生物大脑生物神经元 人工神经元 ─────── ───────── Dendrite ───► 树突 输入 x1, x2, ..., xn │ │ ▼ ▼ Cell Body ───► 细胞体 加权求和 偏置 │ │ ▼ ▼ Axon ───► 轴突 激活函数 │ │ ▼ ▼ Synapse ───► 突触 输出 y人工神经元的数学模型y activation(Σ(w_i × x_i) b)2.4 神经网络的结构三层神经网络输入层 隐藏层 输出层 (3个节点) (3个节点) (2个节点) x1 ──w11──→ h1 ──w11──→ o1 ╲ ╱ ╲ ╱ ╲╱ ╲╱ ╱╲ ╱╲ ╱ ╲ ╱ ╲ x2 ──w22──→ h2 ──w22──→ o2 ╲ ╱ ╱ ╲ ╲╱ ╱ ╲ ╱╲ ╲ ╱ ╱ ╲ ╲ ╱ x3 ──w33──→ h3 ──w33──→ 每个连接都有一个权重 w 全连接(Fully Connected): 每个节点与下一层所有节点相连参数数量计算对于网络结构3-3-2输入层 - 隐藏层3 × 3 9 个权重 隐藏层 - 输出层3 × 2 6 个权重 偏置3隐藏层 2输出层 5 个 总参数9 6 5 20 个通用公式对于网络n_0 - n_1 - n_2 - ... - n_L总参数 Σ(n_i × n_{i1}) Σ(n_i) (i从0到L-1) ↑ ↑ 层间权重 每层的偏置2.5 模型训练的本质训练的本质是调整权重和偏置使得网络的输出尽可能接近目标输出。训练流程1. 初始化权重随机或小值 ↓ 2. 正向传播Forward Propagation - 输入 - 隐藏层 - 输出层 - 计算当前输出 ↓ 3. 计算误差Loss - Loss target - output ↓ 4. 反向传播Backward Propagation - 将误差从输出层传回输入层 - 计算每个权重对误差的贡献 ↓ 5. 更新权重 - w_new w_old - η × ∂Loss/∂w ↓ 6. 重复步骤2-5多轮训练2.6 全连接的意义全连接Fully Connected意味着上一层每个节点都与下一层每个节点相连。为什么全连接信息最大化每个节点都能接收到上一层所有节点的信息表达能力最强理论上可以拟合任意函数万能近似定理梯度传播充分误差可以传播到每一个权重计算量分析全连接层的计算复杂度对于层An个节点- 层Bm个节点 - 权重矩阵大小m × n - 一次前向传播O(m × n) 次乘法 - 一次反向传播O(m × n) 次乘法示例MNIST网络784-100-10输入层 - 隐藏层784 × 100 78,400 个权重 隐藏层 - 输出层100 × 10 1,000 个权重 总权重79,400 个总结在本篇博客中我们学习了预测器用线性回归模型根据输入预测输出分类器用阈值将连续输出转换为类别标签线性分类器的局限XOR问题无法用一条直线解决激活函数Sigmoid、Tanh、ReLU等引入非线性神经网络结构多层神经元全连接训练的本质通过调整权重最小化误差关键公式回顾预测器y w × x b 神经元y activation(Σ(w_i × x_i) b) Sigmoidσ(x) 1 / (1 e^(-x)) 参数数量Σ(n_i × n_{i1}) Σ(n_i)下一篇预告第2篇神经网络的正向传播与误差的反向传播你将学习矩阵运算在神经网络中的应用信号如何在多层网络中传播误差如何反向传播到每一层每个权重对误差的贡献如何计算参考文献Tariq Rashid, 《Python神经网络编程》Ian Goodfellow 等, 《深度学习》MNIST数据库http://yann.lecun.com/exdb/mnist/代码仓库本文所有代码可在服务器/root/nn_blog/目录下找到。作者腾讯DevOps工程师 | 最后更新2026年7月