二分类原理与 Python 实现)
教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载本文基于开源课程 AI-For-Beginners课程入口中“Introduction to Neural Networks: Perceptron”一课lesson 03 主文档完整讲解感知机这一最简神经网络模型的历史由来、数学模型、梯度下降训练算法并结合仓库内的 Perceptron.ipynb 动手实验与 多分类 Lab演示如何用它完成玩具数据集与 MNIST 手写数字的分类实战。读完本文你将能够独立推导感知机的权重更新公式、用 NumPy 手写训练代码、理解学习率的影响与 XOR 局限并掌握“一对其余One-vs-All argmax”扩展多分类的方法。一、历史背景1957 年的 Mark-1 硬件感知机感知机是现代神经网络最早的雏形之一。1957 年康奈尔航空实验室Cornell Aeronautical Laboratory的 Frank Rosenblatt 实现了名为“Mark-1”的硬件设备用于识别三角形、正方形、圆形等原始几何图形。这是人类最早尝试搭建“类似现代神经网络”的机器之一。|Mark-1 的输入图像由一个20×20 的光电池阵列表示因此网络共有400 个输入和1 个二值输出。整个网络只包含一个神经元这个神经元也被称为阈值逻辑单元threshold logic unit。网络中的权重参数在当时由物理电位器实现需要在训练阶段像调节电阻一样手工调整。补充知识点电位器potentiometer是一种允许使用者调节电路电阻的器件Mark-1 用它来物理化地表示权重值。当时《纽约时报》对感知机寄予厚望称其为“电子计算机的胚胎海军期待它能行走、交谈、观看、书写、自我复制并对自身的存在有所意识”。虽然这远超出了当时的技术能力但感知机作为二分类模型的数学思想至今仍是深度学习的基础。二、感知机模型最简单的线性二分类器2.1 模型定义假设样本有 N 个特征则输入向量 x 是一个 N 维向量。感知机是一个二分类模型对每个输入向量 x输出为1 或 -1取决于其所属类别。输出由如下公式计算y(x) f(wᵀx)其中 w 是权重向量wᵀx是权重与输入的线性组合点积f 是阶跃激活函数step activation functionf(x) { 1 if x ≥ 0 -1 if x 0 }2.2 偏置技巧bias trick一个通用的线性模型除了权重向量 w 外还应当包含偏置项 b即理想的计算形式为y f(wᵀx b)。为了简化实现课程配套 notebookPerceptron.ipynb采用了一个常用技巧给输入特征额外增加一维该维度的值恒为 1从而把偏置吸收进权重向量中。例如在二维特征下原本的样本[x0, x1]会被扩展为[x0, x1, 1]权重向量相应变为 3 维[w0, w1, w2]其中w2即充当偏置。在 notebook 中正是这样构造正负样本的pos_examples np.array([ [t[0], t[1], 1] for i,t in enumerate(train_x) if train_labels[i]0]) neg_examples np.array([ [t[0], t[1], 1] for i,t in enumerate(train_x) if train_labels[i]0])这样处理后分类边界超平面由wᵀx 0给出在二维平面上就是直线方程w0·x0 w1·x1 w2 0可直接绘图验证见下文第四节。三、感知机训练误差准则与梯度下降3.1 感知机准则Perceptron Criterion训练感知机的目标是找到权重向量 w使绝大多数样本被正确分类即让误差 E 最小。课程将误差定义为感知机准则E(w) -Σ wᵀxᵢ·tᵢ其中求和仅针对被错误分类的训练样本 ixᵢ 是输入数据tᵢ 取-1负样本或 1正样本。直观理解对于被误分类的样本wᵀxᵢ与 tᵢ 符号相反二者乘积为负取负号后为正误差全部正确分类时误差为 0。该准则把 E 看成权重 w 的函数训练即求使其最小化的 w。3.2 梯度下降更新公式最小化 E 的经典方法是梯度下降gradient descent从初始权重 w⁽⁰⁾ 出发每一步沿 E 的负梯度方向更新权重w⁽ᵗ⁺¹⁾ w⁽ᵗ⁾ - η·∇E(w)其中 η 是学习率learning rate∇E(w)是 E 的梯度。对感知机准则求梯度后可化简为如下简洁的更新规则w⁽ᵗ⁺¹⁾ w⁽ᵗ⁾ η·Σ xᵢ·tᵢ求和仍针对误分类样本。也就是说遇到正样本被误判为负就把权重沿该样本方向加上一步遇到负样本被误判为正就沿反方向减去一步。3.3 可运行的 Python 实现课程主文档lesson 03 README给出了算法骨架notebook 中则给出了完整可运行、带准确率报告的版本Perceptron.ipynbdef train(positive_examples, negative_examples, num_iterations 100, learning_rate 0.01): num_dims positive_examples.shape[1] # 初始化权重简单起见置零随机初始化同样可行 weights np.zeros((num_dims,1)) pos_count positive_examples.shape[0] neg_count negative_examples.shape[0] report_frequency 10 for i in range(num_iterations): # 每轮随机挑一个正样本和一个负样本 pos random.choice(positive_examples) neg random.choice(negative_examples) z np.dot(pos, weights) if z 0: # 正样本被误判为负 → 沿正方向更新 weights weights learning_rate * pos.reshape(weights.shape) z np.dot(neg, weights) if z 0: # 负样本被误判为正 → 沿负方向更新 weights weights - learning_rate * neg.reshape(weights.shape) # 周期性打印当前全部样本上的准确率 if i % report_frequency 0: pos_out np.dot(positive_examples, weights) neg_out np.dot(negative_examples, weights) pos_correct (pos_out 0).sum() / float(pos_count) neg_correct (neg_out 0).sum() / float(neg_count) print(Iteration{}, pos correct{}, neg correct{}.format(i,pos_correct,neg_correct)) return weights与 README 中weights[0,0,0]的示意版本相比notebook 版本有三点关键差异对应源码可对照查看用np.zeros((num_dims,1))按特征维度初始化而不是写死 3 维使函数可复用于 MNIST 这类 784 维输入更新时用pos.reshape(weights.shape)保证 NumPy 广播维度一致默认学习率取0.01README 示例中为eta 1并周期性地打印正、负样本各自的准确率便于观察收敛过程。3.4 学习率的影响学习率 η 控制每一步权重调整的幅度是梯度下降中同时影响收敛速度与稳定性的关键超参数notebook 中有专门的实验小节较大的学习率如 1.0收敛更快但可能“越过”最优解导致震荡、不收敛较小的学习率如 0.001收敛更慢但更可能精确逼近最优解。notebook 中提供了对比实验代码分别以learning_rates [0.001, 0.01, 0.1, 1.0]训练并绘制决策边界还通过ipywidgets滑块提供了交互式实验interact(train_and_plot_with_lr, learning_ratewidgets.FloatSlider(...))可实时观察决策边界与最终权重值随学习率的变化。四、动手实验一玩具数据集上的二分类notebook 首先用 sklearn 的make_classification生成一个 2 特征的玩具分类数据集可类比医学上按大小和年龄区分良、恶性肿瘤的问题n 50 X, Y make_classification(n_samples n, n_features2, n_redundant0, n_informative2, flip_y0) Y Y*2-1 # 把 0/1 标签转换为 -1/1 X X.astype(np.float32); Y Y.astype(np.int32) # 80% 训练 / 20% 测试 train_x, test_x np.split(X, [ n*8//10]) train_labels, test_labels np.split(Y, [n*8//10])随后对训练数据调用train(pos_examples, neg_examples)。从 notebook 的实际输出可以看到初始准确率约 50%经过若干次迭代后迅速提升到接近 90%例如 Iteration50 时正样本准确率 94.7%、负样本 90.5%。训练结束后用如下函数在测试集上评估def accuracy(weights, test_x, test_labels): res np.dot(np.c_[test_x,np.ones(len(test_x))],weights) return (res.reshape(test_labels.shape)*test_labels0).sum()/float(len(test_labels)) accuracy(wts, test_x, test_labels) # 玩具数据上输出为 1.0决策边界即w0·x0 w1·x1 w2 0所对应的直线notebook 中的plot_boundary()函数将该直线与正蓝/负红样本绘制在同一张图上直观展示感知机如何用一条直线把两类数据分开。五、感知机的局限XOR 问题与线性可分性感知机是线性分类器只有当两类数据线性可分能被一条直线/超平面分开时训练才会收敛否则训练过程无法收敛。最经典的不可分例子是XOR 布尔函数x1 \ x201001110notebook 手工构造了 XOR 的正负样本pos_examples_xor np.array([[1,0,1],[0,1,1]]) # XOR1 的两个样本 neg_examples_xor np.array([[1,1,1],[0,0,1]]) # XOR0 的两个样本 snapshots_xor train_graph(pos_examples_xor,neg_examples_xor,1000)训练 1000 次后准确率始终无法超过 75%——因为不可能画出一条直线把四个点按 XOR 规则完全分开。这一观察最早由 Marvin Minsky 与 Seymour Papert 在 1969 年的著作《Perceptrons》中明确指出曾使神经网络研究陷入近 10 年的低潮。不过正如课程后续章节将展示的多层级网络多层感知机完全可以解决这类非线性问题。六、动手实验二MNIST 手写数字二分类尽管感知机无法解决 XOR它却能处理更复杂的现实问题例如手写字符识别。6.1 数据集简介与加载MNIST 数据集由美国国家标准与技术研究院NIST创建包含60,000 张训练手写数字采集自约 250 名研究所的学生与员工和10,000 张测试数字来自不同人群。所有数字都是28×28 像素的灰度图即 784 个输入特征。仓库根目录已提供打包好的数据文件 data/mnist.pkl.gznotebook 直接加载即可with gzip.open(data/mnist.pkl.gz, rb) as mnist_pickle: MNIST pickle.load(mnist_pickle, encodinglatin1) features MNIST[Train][Features].astype(np.float32) / 256.0 # 归一化到 [0,1] labels MNIST[Train][Labels]6.2 二分类两个数字由于感知机是二分类器课程先把问题限制为识别两个数字。notebook 中的set_mnist_pos_neg(positive_label, negative_label)函数按标签筛出正、负样本例如set_mnist_pos_neg(1, 0)区分数字 1 与 0set_mnist_pos_neg(2, 5)区分数字 2 与 5。随后用train_graph(pos, neg, 1000)训练并提供交互式滑块“回放”训练过程左侧显示28×28 的权重矩阵热力图右侧显示准确率曲线。0 vs 1 的准确率会很快逼近 100%对权重矩阵的观察非常直观——中间区域权重高对应数字 1 通常覆盖的像素两侧权重为负对应数字 0 的竖向笔画区域。这也揭示了感知机的识别机理数字 1 的中心像素乘以高权重得到正值而数字 0 对应的像素乘以负权重得到负值。局限性提示如果输入的 1 被水平平移、其像素落到 0 的竖向笔画区域感知机可能给出错误结果——因为 MNIST 数字都是居中对齐的感知机正是依赖这一位置信息来区分数字。6.3 为什么 2 与 5 难以分离PCA 分析2 与 5 的区分相对困难虽然准确率能到 85% 以上但可以明显看到感知机在某一点后停止学习。为解释原因notebook 借助主成分分析PCA把 784 维输入降到 2 维进行可视化from sklearn.decomposition import PCA mypca PCA(n_components2) mypca.fit(M) # M 为正负样本拼接矩阵 pos_points mypca.transform(positive_images[:200]) neg_points mypca.transform(negative_images[:200])结果对比pca_analysis(1,0)与pca_analysis(2,5)显示0 和 1 在投影空间中能被一条直线清晰分开说明其在原始 784 维空间中也是线性可分的而2 和 5 找不到一个能把两类完全分开的好投影因此必然存在误分类。这正对应了感知机作为线性分类器的本质局限也为课程后续引入神经网络解决非线性分类与数字不对齐问题埋下伏笔后续课程将把 MNIST 十分类准确率提升到 99% 以上。七、要点总结课程通过上述实验得出的核心结论与 notebook 结尾 Takeaway 一致我们认识了最简单的神经网络架构——单层感知机我们用基于梯度下降的简单训练过程“手工”实现了感知机尽管结构简单单层感知机已能解决手写数字识别这类相当复杂的问题单层感知机是线性分类器其分类能力与逻辑回归相同在样本空间中感知机用一个超平面分离两类输入数据。八、课后实践从二分类到多分类Lab课程作业lab/README.md配套 PerceptronMultiClass.ipynb要求把二分类感知机扩展为0-9 十个数字的完整分类器对每个数字构造一个“该数字 vs 其余所有数字”的二分类数据集训练10 个二分类感知机每个数字一个定义一个函数对输入数字进行分类并计算训练集与测试集上的分类准确率打印混淆矩阵confusion matrix。任务还给出了关键优化提示把 10 个感知机的权重合并成一个矩阵就可以通过一次矩阵乘法同时应用全部 10 个感知机然后对输出执行argmax找到最可能的数字。这种“一对其余 argmax”的思想正是后续多分类神经网络输出层设计如 Softmax 分类器的前身。课程为每课配置了课前与课后测验quiz并建议读者尝试在 Microsoft Learn / Azure ML Designer 平台上体验“平均感知机”组件以加深理解如需在本仓库中完成实验可直接打开上述两个 notebook 依次运行全部代码单元依赖 numpy、scikit-learn、matplotlib、ipywidgets、gzip、pickle数据文件即仓库内的 data/mnist.pkl.gz无需额外下载。九、后续学习路径本课属于课程“第 3 部分神经网络”lessons/3-NeuralNetworks/README.md的第一课。感知机作为基石后续课程将依次展开04-OwnFramework多层级网络与自建框架配套 OwnFramework.ipynb05-FrameworksPyTorch 与 Keras/TensorFlow 框架入门配套 IntroPyTorch.ipynb 与 IntroKerasTF.ipynb以及 04-OwnFramework 中关于过拟合的讨论。掌握了单层感知机你就已经站在了理解现代深度学习大厦的第一级台阶上。赞分享教程人工智能机器学习深度学习【免费下载链接】AI-For-Beginners12 Weeks, 24 Lessons, AI for All!项目地址https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners点击查看免费下载相关推荐AI for Beginners 课程精读单层感知机Perceptron——从 Mark-1 硬件到 MNIST 手写数字分类AI for Beginners 课程精读单层感知机Perceptron——从 Mark 1 硬件到 MNIST 手写数字分类 本文基于 AI For B教程人工智能机器学习深度学习AI-For-Beginners 感知机Perceptron完全指南从 Rosenblatt 的 Mark-1 到 MNIST 手写数字识别AI For Beginners 感知机Perceptron完全指南从 Rosenblatt 的 Mark 1 到 MNIST 手写数字识别 本指南对应教程人工智能机器学习深度学习感知机Perceptron入门从 Mark-1 到二元分类与梯度下降训练——generative-ai-for-beginners 第 15 课基础篇感知机Perceptron入门从 Mark 1 到二元分类与梯度下降训练——generative ai for beginners 第 15 课基础篇 本教程人工智能大模型上一篇FakeLocation3步实现Android应用级位置模拟的完整实战指南下一篇3分钟快速美化macOS鼠标指针让你的Windows桌面焕然一新创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考