当前位置: 首页 > article >正文

别再死记硬背了!用Python从零实现感知机,手把手带你跑通李航《统计学习方法》第一个例子

用Python从零实现感知机李航《统计学习方法》例题3.1实战解析当你第一次翻开李航老师的《统计学习方法》看到感知机那一章的数学公式和抽象描述时是否感到一头雾水作为机器学习中最基础的分类模型感知机看似简单但真正理解它的工作原理却需要将理论与代码实践相结合。本文将带你用Python从零开始实现感知机通过亲手编写每一行代码来直观理解这个经典算法。我们将以书中例题3.1的数据集为例完整展示如何用Python实现感知机的训练过程。从数据准备、模型初始化到梯度下降的每一步迭代最后可视化决策边界你将看到抽象的数学公式如何转化为实际运行的代码。这种做中学的方式远比死记硬背公式有效得多。1. 感知机基础与准备工作1.1 感知机模型的核心思想感知机(Perceptron)是Frank Rosenblatt在1957年提出的二分类线性模型它奠定了神经网络的基础。其核心思想非常简单找到一个能够将两类数据分开的超平面。对于二维数据这个超平面就是一条直线三维则是平面更高维度我们统称为超平面。感知机的数学模型可以表示为f(x) sign(w·x b)其中w是权重向量b是偏置项sign是符号函数输出1或-11.2 开发环境配置在开始编码前我们需要准备Python环境。推荐使用Anaconda创建虚拟环境conda create -n perceptron python3.8 conda activate perceptron pip install numpy matplotlib主要依赖库NumPy处理矩阵运算Matplotlib数据可视化1.3 准备例题数据集根据例题3.1我们创建以下数据集import numpy as np # 正实例点 positive np.array([[3, 3], [4, 3]]) # 负实例点 negative np.array([[1, 1]]) # 合并数据集和标签 X np.vstack((positive, negative)) y np.array([1, 1, -1]) # 1代表正类-1代表负类2. 感知机的Python实现2.1 初始化感知机类我们首先创建一个Perceptron类包含模型初始化方法class Perceptron: def __init__(self): self.w None # 权重 self.b 0 # 偏置 def initialize(self, input_dim): 初始化模型参数 self.w np.zeros(input_dim) self.b 02.2 实现预测函数预测函数根据当前权重和偏置计算输出def predict(self, x): 预测单个样本的分类 return np.sign(np.dot(self.w, x) self.b)2.3 训练过程实现训练过程是感知机的核心采用随机梯度下降法def train(self, X, y, lr1, epochs100): 训练感知机模型 n_samples, n_features X.shape self.initialize(n_features) for epoch in range(epochs): misclassified 0 for idx, x_i in enumerate(X): if y[idx] * self.predict(x_i) 0: # 误分类判断 self.w lr * y[idx] * x_i # 更新权重 self.b lr * y[idx] # 更新偏置 misclassified 1 print(fEpoch {epoch1}: 更新后 w{self.w}, b{self.b}) if misclassified 0: # 如果没有误分类点 print(f训练完成于第{epoch1}轮迭代) break3. 运行与调试模型3.1 训练模型并观察迭代过程现在我们可以实例化感知机并进行训练perceptron Perceptron() perceptron.train(X, y, lr1)运行后会看到类似以下的输出这与书中例题3.1的迭代过程完全一致Epoch 1: 更新后 w[3. 3.], b1 Epoch 2: 更新后 w[2. 2.], b0 Epoch 3: 更新后 w[1. 1.], b-1 Epoch 4: 更新后 w[0. 0.], b-2 Epoch 5: 更新后 w[3. 3.], b-1 训练完成于第6轮迭代3.2 决策边界可视化理解感知机的最好方式就是可视化它的决策边界。我们添加以下可视化代码import matplotlib.pyplot as plt def plot_decision_boundary(model, X, y): # 绘制数据点 plt.scatter(X[y1, 0], X[y1, 1], colorblue, markero, label正类) plt.scatter(X[y-1, 0], X[y-1, 1], colorred, markerx, label负类) # 计算并绘制决策边界 x1 np.linspace(0, 5, 100) if model.w[1] ! 0: x2 -(model.w[0] * x1 model.b) / model.w[1] plt.plot(x1, x2, g-, label决策边界) plt.xlabel(特征1) plt.ylabel(特征2) plt.legend() plt.title(感知机决策边界) plt.grid(True) plt.show() plot_decision_boundary(perceptron, X, y)4. 深入理解感知机的局限性4.1 线性可分性与感知机的收敛性感知机的一个重要特性是当数据线性可分时算法保证收敛。这被称为感知机收敛定理。在我们的例子中数据明显是线性可分的因此感知机能够在有限步内找到分离超平面。验证线性可分性的简单方法是观察数据分布from sklearn.decomposition import PCA pca PCA(n_components1) X_pca pca.fit_transform(X) plt.scatter(X_pca, y) plt.title(数据在一维投影上的分布) plt.show()4.2 感知机无法解决异或问题感知机作为线性模型无法解决非线性可分问题如经典的异或(XOR)问题# XOR数据集 X_xor np.array([[0,0], [0,1], [1,0], [1,1]]) y_xor np.array([-1, 1, 1, -1]) # 尝试用感知机解决XOR问题 xor_perceptron Perceptron() xor_perceptron.train(X_xor, y_xor, epochs100) plot_decision_boundary(xor_perceptron, X_xor, y_xor)运行后会看到感知机无法找到合适的决策边界这解释了为什么需要更复杂的模型如多层感知机来处理非线性问题。5. 扩展与优化5.1 对偶形式的感知机实现除了原始形式感知机还有对偶形式的实现这在某些情况下计算效率更高class DualPerceptron: def __init__(self): self.alpha None # 对偶变量 self.b 0 self.gram None # Gram矩阵 def fit(self, X, y, lr1, epochs100): n_samples X.shape[0] self.alpha np.zeros(n_samples) self.b 0 self.gram np.dot(X, X.T) # 预计算Gram矩阵 for epoch in range(epochs): misclassified 0 for i in range(n_samples): if y[i] * (np.sum(self.alpha * y * self.gram[i]) self.b) 0: self.alpha[i] lr self.b lr * y[i] misclassified 1 if misclassified 0: break # 计算最终权重 self.w np.sum((self.alpha * y).reshape(-1,1) * X, axis0)5.2 添加学习率调度为了提高训练稳定性我们可以实现学习率调度def lr_scheduler(initial_lr, epoch, total_epochs): 学习率衰减函数 return initial_lr * (0.95 ** epoch) # 在train方法中使用 current_lr lr_scheduler(initial_lr, epoch, epochs) self.w current_lr * y[idx] * x_i5.3 批量梯度下降实现除了随机梯度下降我们还可以实现批量梯度下降版本def batch_train(self, X, y, lr1, epochs100, batch_size2): n_samples X.shape[0] self.initialize(X.shape[1]) for epoch in range(epochs): # 随机打乱数据 indices np.random.permutation(n_samples) X_shuffled X[indices] y_shuffled y[indices] for i in range(0, n_samples, batch_size): batch_X X_shuffled[i:ibatch_size] batch_y y_shuffled[i:ibatch_size] # 计算批量梯度 grad_w np.zeros_like(self.w) grad_b 0 misclassified 0 for x_i, y_i in zip(batch_X, batch_y): if y_i * self.predict(x_i) 0: grad_w y_i * x_i grad_b y_i misclassified 1 if misclassified 0: self.w lr * grad_w / misclassified self.b lr * grad_b / misclassified

相关文章:

别再死记硬背了!用Python从零实现感知机,手把手带你跑通李航《统计学习方法》第一个例子

用Python从零实现感知机:李航《统计学习方法》例题3.1实战解析 当你第一次翻开李航老师的《统计学习方法》,看到感知机那一章的数学公式和抽象描述时,是否感到一头雾水?作为机器学习中最基础的分类模型,感知机看似简单…...

手机热点+ESP-01S:零路由器环境下,手把手搞定TCP客户端与服务器双向通信

手机热点ESP-01S:零路由器环境下实现TCP双向通信的实战指南 在移动开发或物联网原型设计中,我们常遇到没有传统路由器的临时场景——可能是校园实验室的角落、户外测试场地,或是深夜宿舍断电后的应急调试。这时,手机热点成为最可靠…...

从零搭建RK3588多路SerDes摄像头监控系统:V4L2框架设计与USB HAL对接实战

RK3588多路SerDes摄像头系统架构设计与工程实践 在智能安防和工业视觉领域,多摄像头协同工作已成为刚需。RK3588作为一款高性能处理器,配合SerDes技术能够构建稳定可靠的多路视觉系统。本文将深入探讨从硬件连接到上层应用的全链路实现方案。 1. SerDes技…...

网络学习实例:多网段企业网络部署

网络学习实例:基础模型第一部分:网络拓扑与设计目标本网络设计为一个企业或教育实验室环境,核心目标是实现三个隔离网段之间的互联互通,同时提供关键网络服务。拓扑结构如下:三个网段:每个网段对应一个VLAN…...

Zed快捷键大全:50个必备快捷键提升你的编码速度

Zed快捷键大全:50个必备快捷键提升你的编码速度 【免费下载链接】zed Rethinking code editing. 项目地址: https://gitcode.com/gh_mirrors/zed/zed Zed是一款重新定义代码编辑体验的编辑器,通过合理使用快捷键可以显著提升编码效率。本文整理了…...

NanoNeuron代码实现原理:深入理解权重、偏置和损失函数的作用

NanoNeuron代码实现原理:深入理解权重、偏置和损失函数的作用 【免费下载链接】nano-neuron 🤖 NanoNeuron is 7 simple JavaScript functions that will give you a feeling of how machines can actually "learn" 项目地址: https://gitco…...

Docker镜像配置的“隐形负债”:镜像复用率<35%?资深架构师首曝企业级配置治理框架

第一章:Docker镜像配置的“隐形负债”现象全景透视 在容器化实践中,Docker镜像常被误认为是轻量、纯净、一次构建处处运行的理想封装单元。然而大量生产事故与性能劣化案例揭示:镜像配置中潜藏着一类难以察觉却持续侵蚀系统稳定性和可维护性的…...

bwip-js跨平台应用开发:React、Electron与移动端集成

bwip-js跨平台应用开发:React、Electron与移动端集成 【免费下载链接】bwip-js Barcode Writer in Pure JavaScript 项目地址: https://gitcode.com/gh_mirrors/bw/bwip-js bwip-js是一款纯JavaScript实现的条形码生成工具,能够轻松集成到React、…...

K8s+Docker在智能灌溉系统中的轻量化部署,为什么73%的县域农业平台半年内完成容器迁移?

第一章:K8sDocker轻量化部署在智能灌溉系统中的战略价值在边缘计算与农业物联网深度融合的背景下,智能灌溉系统正从单机控制向分布式协同演进。传统嵌入式方案面临固件升级困难、多厂商设备兼容性差、算法模型迭代滞后等瓶颈,而 Kubernetes 与…...

HarmonyOS6 ArkTS RichEditor组件使用文档

文章目录完整代码核心API1. 控制器 RichEditorController2. 基础属性3. 核心事件4. 自定义能力总结1. 插入富文本内容2. 修改文本样式3. 获取选区信息4. 自定义键盘RichEditor 是 HarmonyOS6 提供的富文本编辑组件,支持文本样式编辑、图片/Symbol插入、自定义键盘、…...

vis-timeline 事件处理完全教程:点击、拖拽和自定义回调函数

vis-timeline 事件处理完全教程:点击、拖拽和自定义回调函数 【免费下载链接】vis-timeline 📅 Create a fully customizable, interactive timelines and 2d-graphs with items and ranges. 项目地址: https://gitcode.com/gh_mirrors/vi/vis-timelin…...

【2026 Blazor企业级准入标准】:微软Partner认证团队强制要求的6项安全/可观测性配置清单

第一章:Blazor企业级准入标准的演进背景与合规意义 随着.NET平台持续向云原生与全栈统一架构演进,Blazor已从早期实验性框架成长为支撑关键业务系统的主流技术栈。企业级应用对安全性、可审计性、长期可维护性及跨团队协作一致性的要求,倒逼开…...

HarmonyOS6 ArkTS TextInput组件使用文档

文章目录完整代码核心基础配置1. 组件初始化参数2. 控制器创建3. 响应式状态变量基础样式自定义1. 占位符样式定制2. 输入文字样式定制3. 光标与文本对齐样式4. 通用布局样式核心输入控制能力1. 输入类型切换(InputType)2. 字数限制与计数器3. 输入过滤&…...

jQuery-contextMenu:构建现代化Web应用上下文菜单的终极指南

jQuery-contextMenu:构建现代化Web应用上下文菜单的终极指南 【免费下载链接】jQuery-contextMenu jQuery contextMenu plugin & polyfill 项目地址: https://gitcode.com/gh_mirrors/jq/jQuery-contextMenu jQuery-contextMenu 是一款功能强大的上下文菜…...

三、vs code快捷键

1.设置Ctrl,2.还原整个窗口布局命令面板 Ctrl Shift P → 输入 View: Reset View Locations → 回车,所有面板回归默认位置。...

Windows终极免费PDF处理工具:Poppler完整使用指南

Windows终极免费PDF处理工具:Poppler完整使用指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows上的PDF处理而烦恼吗&a…...

AutoDL租完服务器别只用Jupyter!Pycharm远程开发全链路配置指南(从开机到跑通第一个模型)

AutoDL租完服务器别只用Jupyter!Pycharm远程开发全链路配置指南(从开机到跑通第一个模型) 当你在AutoDL上租用了强大的GPU服务器后,是否还在忍受Web版Jupyter Notebook的局限?本文将带你解锁专业开发者的终极武器——…...

nli-MiniLM2-L6-H768部署案例:轻量级NLI模型如何替代BERT-large做语义精排

nli-MiniLM2-L6-H768部署案例:轻量级NLI模型如何替代BERT-large做语义精排 1. 模型概述 nli-MiniLM2-L6-H768 是一个专为自然语言推理(NLI)任务优化的轻量级模型,其核心能力是判断两段文本之间的语义关系。与传统的BERT-large等…...

麒麟V10离线环境生存指南:如何正确下载并安装Ubuntu deb包(附国内镜像源地址)

麒麟V10离线环境高效运维实战:deb包管理与镜像源深度解析 在政企级IT基础设施中,麒麟操作系统V10凭借其安全稳定的特性已成为关键业务系统的首选。但受限于特殊网络环境,许多运维人员常陷入"无外网如何安装软件"的困境。本文将系统…...

AUO友达5.7寸液晶屏幕G057VN01 V2.20规格宽温液晶模组

工业设备显示屏从最初的 TN 单色面板,发展到如今的 AHVA(Advanced Hyper-Viewing-Angle)全视角架构,显示技术已趋成熟。随着物联网终端、智能制造与能源装备的普及,显示器件被要求在 −30C 至 85C 的极端温区中仍保持色…...

【立煌】BOE京东方EV101WUM-N81规格10.1寸液晶屏幕

在当今的工业与户外显示领域,高亮度与高分辨率 正成为核心竞争指标。京东方(BOE)推出的 EV101WUM-N81 以 1000 cd/m 超高亮度 与 19201200 WUXGA 分辨率 重新定义了10.1英寸级工业液晶屏的显示标准。该面板采用 ADS(Advanced Supe…...

CSS如何制作标签页效果_利用display flex与盒模型

Flex布局标签页头部最可控,需设flex容器、防换行、处理min-width;切换内容用visibility:hidden更优;必同步aria-selected和role属性;移动端优先用scroll-snap实现滑动。用 display: flex 布局标签页头部,别碰 float 或…...

【立煌】G150XTN06.0规格友达15寸工业液晶屏幕AUO液晶模组

在工业自动化、机台控制、医疗仪器及安防显示等应用领域,15英寸液晶模组长期被视为“工业标准尺寸”。友达(AUO)推出的G150XTN06.0正是其中的代表型号之一。这款屏凭借宽温设计、可更换背光、内置LED驱动器与6/8位灰阶兼容特性,实…...

PyTorch训练循环中zero_grad()的正确调用位置详解

在PyTorch中,optimizer.zero_grad()必须在loss.backward()之前执行,且绝不能位于backward()与step()之间;其具体位置(循环开头或backward()前一刻)不影响梯度计算逻辑,但影响代码可读性与多优化器场景下的正…...

App Metrics高级用法:自定义指标、过滤器和采样策略

App Metrics高级用法:自定义指标、过滤器和采样策略 【免费下载链接】AppMetrics App Metrics is an open-source and cross-platform .NET library used to record and report metrics within an application. 项目地址: https://gitcode.com/gh_mirrors/app/App…...

深度剖析Cursor-Free-VIP:突破AI编程助手限制的设备指纹重构技术

深度剖析Cursor-Free-VIP:突破AI编程助手限制的设备指纹重构技术 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reache…...

django-cacheops实战案例:构建高性能电商系统的缓存架构设计

django-cacheops实战案例:构建高性能电商系统的缓存架构设计 【免费下载链接】django-cacheops A slick ORM cache with automatic granular event-driven invalidation. 项目地址: https://gitcode.com/gh_mirrors/dj/django-cacheops 在当今电商领域&#…...

告别杂乱连线!用Proteus网络标签和总线功能高效绘制STM32核心板原理图

告别杂乱连线!用Proteus网络标签和总线功能高效绘制STM32核心板原理图 当你在Proteus中绘制一个包含STM32 MCU和多个外设的复杂原理图时,是否经常遇到这样的困扰:密密麻麻的连线像蜘蛛网一样交织在一起,不仅难以阅读,后…...

django-cacheops模板集成:Django和Jinja2缓存标签完全手册

django-cacheops模板集成:Django和Jinja2缓存标签完全手册 【免费下载链接】django-cacheops A slick ORM cache with automatic granular event-driven invalidation. 项目地址: https://gitcode.com/gh_mirrors/dj/django-cacheops django-cacheops是一个强…...

浦语灵笔2.5-7B多场景:支持教育、金融、政务、医疗等6大垂直领域

浦语灵笔2.5-7B多场景实战:解锁教育、金融、政务、医疗等6大垂直领域 今天咱们来聊聊一个特别实用的AI工具——浦语灵笔2.5-7B。你可能听说过很多大模型,但这款有点不一样,它不仅能看懂文字,还能看懂图片,甚至能回答关…...