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

用Python手把手教你实现隐马尔可夫模型(HMM)从理论到实战

用Python手把手教你实现隐马尔可夫模型HMM从理论到实战在自然语言处理、语音识别和生物信息学等领域隐马尔可夫模型Hidden Markov Model, HMM是一种经典的概率图模型。本文将带你从零开始用Python实现一个完整的HMM系统包括概率计算、参数学习和解码预测三大核心问题最终完成一个命名实体识别NER的实际应用案例。1. HMM基础理论与Python实现框架隐马尔可夫模型由两个随机过程组成一个是不可观测的状态序列另一个是可观测的符号序列。模型由以下五元组定义class HMM: def __init__(self, states, observations): self.states states # 隐藏状态集合 self.observations observations # 观测符号集合 self.A None # 状态转移概率矩阵 self.B None # 观测概率矩阵 self.pi None # 初始状态分布状态转移概率矩阵A表示从一个隐藏状态转移到另一个隐藏状态的概率晴阴雨晴0.70.20.1阴0.30.50.2雨0.20.30.5观测概率矩阵B表示在某个隐藏状态下观察到某个符号的概率干湿晴0.80.2阴0.30.7雨0.10.92. HMM三大问题与Python实现2.1 概率计算问题前向算法给定模型参数和观测序列计算该观测序列出现的概率。前向算法通过动态规划高效解决这个问题def forward(self, obs_seq): alpha np.zeros((len(obs_seq), len(self.states))) # 初始化 alpha[0, :] self.pi * self.B[:, self.observations.index(obs_seq[0])] # 递推 for t in range(1, len(obs_seq)): for j in range(len(self.states)): alpha[t, j] np.sum( alpha[t-1, :] * self.A[:, j] ) * self.B[j, self.observations.index(obs_seq[t])] # 终止 return np.sum(alpha[-1, :])提示前向算法的时间复杂度为O(TN²)其中T是观测序列长度N是隐藏状态数。2.2 参数学习问题Baum-Welch算法当模型参数未知时通过观测序列学习模型参数。Baum-Welch算法是EM算法在HMM中的具体实现def baum_welch(self, obs_seqs, max_iter100): for _ in range(max_iter): # E步计算期望 # M步重新估计参数 new_A np.zeros_like(self.A) new_B np.zeros_like(self.B) new_pi np.zeros_like(self.pi) # 这里简化了实现实际需要计算gamma和xi # 更新参数 self.A new_A / np.sum(new_A, axis1, keepdimsTrue) self.B new_B / np.sum(new_B, axis1, keepdimsTrue) self.pi new_pi / np.sum(new_pi)2.3 解码问题Viterbi算法给定观测序列找到最可能的隐藏状态序列。Viterbi算法同样采用动态规划def viterbi(self, obs_seq): T len(obs_seq) N len(self.states) delta np.zeros((T, N)) psi np.zeros((T, N), dtypeint) # 初始化 delta[0, :] self.pi * self.B[:, self.observations.index(obs_seq[0])] # 递推 for t in range(1, T): for j in range(N): trans_prob delta[t-1, :] * self.A[:, j] psi[t, j] np.argmax(trans_prob) delta[t, j] trans_prob[psi[t, j]] * \ self.B[j, self.observations.index(obs_seq[t])] # 回溯 path np.zeros(T, dtypeint) path[-1] np.argmax(delta[-1, :]) for t in range(T-2, -1, -1): path[t] psi[t1, path[t1]] return [self.states[i] for i in path]3. 天气预测案例实战让我们用一个具体的天气预测例子来演示HMM的应用。假设我们只能观察到海藻的干燥程度干、湿但想预测实际的天气状态晴、阴、雨。# 定义模型参数 states [晴, 阴, 雨] observations [干, 湿] # 初始化模型 weather_hmm HMM(states, observations) # 设置模型参数实际应用中通过学习得到 weather_hmm.A np.array([[0.7, 0.2, 0.1], [0.3, 0.5, 0.2], [0.2, 0.3, 0.5]]) weather_hmm.B np.array([[0.8, 0.2], [0.3, 0.7], [0.1, 0.9]]) weather_hmm.pi np.array([0.6, 0.3, 0.1]) # 观测序列 obs_seq [干, 湿, 湿, 干] # 解码预测 predicted_states weather_hmm.viterbi(obs_seq) print(预测的天气序列:, predicted_states)4. 命名实体识别实战HMM在自然语言处理中最经典的应用之一就是命名实体识别。下面我们实现一个简单的NER系统class HMM_NER: def __init__(self): self.tag2id {B-PER:0, I-PER:1, B-LOC:2, I-LOC:3, B-ORG:4, I-ORG:5, O:6} self.id2tag {v:k for k,v in self.tag2id.items()} self.num_tags len(self.tag2id) def train(self, corpus): # 统计转移频次 trans_counts np.zeros((self.num_tags, self.num_tags)) # 统计发射频次 emit_counts np.zeros((self.num_tags, 65536)) # Unicode字符数 # 处理训练数据简化实现 for sentence in corpus: prev_tag None for char, tag in sentence: tag_id self.tag2id[tag] char_code ord(char) emit_counts[tag_id][char_code] 1 if prev_tag is not None: trans_counts[prev_tag][tag_id] 1 prev_tag tag_id # 计算概率加平滑 self.A (trans_counts 1) / (np.sum(trans_counts, axis1, keepdimsTrue) self.num_tags) self.B (emit_counts 1) / (np.sum(emit_counts, axis1, keepdimsTrue) 65536) def predict(self, text): # 使用Viterbi算法解码 obs_seq [ord(char) for char in text] # ... 实现Viterbi算法 ... return predicted_tags注意实际应用中需要考虑更多细节如未登录词处理、特征工程等。HMM在NER中的表现通常不如CRF或深度学习模型但作为基础模型仍有学习价值。5. 性能优化与扩展5.1 对数概率计算为避免数值下溢实际实现中通常使用对数概率log_A np.log(self.A 1e-10) log_B np.log(self.B 1e-10) log_pi np.log(self.pi 1e-10)5.2 扩展应用HMM可以扩展到更复杂的场景连续观测值使用高斯混合模型GMM代替离散观测概率二阶HMM考虑前两个状态的影响输入输出HMM结合外部特征class GaussianHMM: def __init__(self, n_components): self.n_components n_components self.means None self.covars None # ... 其他参数 ... def _compute_log_likelihood(self, X): # 计算高斯概率密度 pass在实际项目中可以直接使用成熟的库如hmmlearnfrom hmmlearn import hmm model hmm.GaussianHMM(n_components3, covariance_typediag) model.fit(X) # X是观测序列通过本文的代码实现和案例演示你应该已经掌握了HMM的核心概念和实现方法。HMM虽然是比较传统的模型但在许多序列建模任务中仍然有其独特的优势。建议读者可以尝试在更大的数据集上应用这些技术或者探索HMM与其他模型如神经网络的结合。

相关文章:

用Python手把手教你实现隐马尔可夫模型(HMM)从理论到实战

用Python手把手教你实现隐马尔可夫模型(HMM)从理论到实战 在自然语言处理、语音识别和生物信息学等领域,隐马尔可夫模型(Hidden Markov Model, HMM)是一种经典的概率图模型。本文将带你从零开始,用Python实…...

lite-avatar形象库实用技巧:如何通过形象ID精准定位职业特征数字人

lite-avatar形象库实用技巧:如何通过形象ID精准定位职业特征数字人 在数字人应用开发中,找到一张符合特定职业、气质和场景需求的“脸”,往往是项目启动的第一个难题。是让设计师花几天时间手绘,还是用通用模型生成一个风格模糊的…...

彻底告别风扇噪音:用FanControl 264版实现电脑静音控制的终极指南

彻底告别风扇噪音:用FanControl 264版实现电脑静音控制的终极指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_…...

ESP32确定性块存储驱动:零开销结构化EEPROM持久化

1. 项目概述ESP32-EEPROM-BlockDriver 是一个面向 ESP32 平台的非易失性存储块设备驱动,其核心设计目标并非模拟传统文件系统,而是为嵌入式应用提供一种确定性、可预测、零运行时开销的结构化数据持久化机制。该驱动不依赖于 ESP-IDF 的nvs(N…...

别再为YOLO模型分发发愁了!PyInstaller打包保姆级教程(含UI、权重文件处理)

YOLO模型分发终极方案:PyInstaller全流程实战指南 当你的YOLO模型在本地运行得风生水起时,如何让没有技术背景的同事或客户也能轻松使用?传统方法往往需要对方安装Python环境、配置依赖库,这个过程足以劝退90%的非技术人员。本文…...

FlowState Lab版本管理与回滚:在星图平台实现平滑升级

FlowState Lab版本管理与回滚:在星图平台实现平滑升级 1. 为什么需要版本管理 在AI模型开发过程中,版本管理就像给代码打标签一样重要。想象一下,你正在使用FlowState Lab开发一个智能客服系统,突然发现最新更新的模型开始给出奇…...

千问3.5-9B模型Java开发环境快速配置:从JDK安装到项目集成

千问3.5-9B模型Java开发环境快速配置:从JDK安装到项目集成 1. 引言 如果你是一名Java开发者,想要快速上手调用千问3.5-9B大模型,这篇文章就是为你准备的。我们将从最基础的JDK安装开始,一步步带你完成整个开发环境的配置&#x…...

从零到一:用JavaScript在Screeps Arena中构建你的首个RTS AI

1. 初识Screeps Arena:编程与策略的完美结合 Screeps Arena是一款独特的编程策略游戏,它将即时战略(RTS)的核心玩法与JavaScript编程完美融合。与传统RTS游戏不同,在这里你不是通过鼠标点击来指挥单位,而是…...

零代码文本分类:AI万能分类器WebUI,3步实现智能打标系统

零代码文本分类:AI万能分类器WebUI,3步实现智能打标系统 1. 引言:告别传统分类的繁琐流程 在信息处理领域,文本分类一直是个高频需求。无论是电商平台的商品评论分析,还是客服系统的工单归类,传统方法都需…...

YOLOv8实战:用Ultralytics最新版快速实现口罩检测(附数据集+完整训练代码)

YOLOv8实战:从零构建口罩检测系统的高效指南 在公共卫生事件频发的当下,智能口罩检测系统已成为商场、医院、交通枢纽等公共场所的刚需。Ultralytics推出的YOLOv8作为当前最先进的实时目标检测框架,其开箱即用的特性让开发者能够快速部署高精…...

MGeo中文地址解析模型惊艳案例:‘哈尔滨市南岗区西大直街92号哈尔滨工业大学一校区’精准识别

MGeo中文地址解析模型惊艳案例:‘哈尔滨市南岗区西大直街92号哈尔滨工业大学一校区’精准识别 1. 引言:从混乱的地址文本到清晰的结构化信息 想象一下,你收到一条用户留言:“货送到哈尔滨市南岗区西大直街92号哈尔滨工业大学一校…...

电子信息专业毕业生就业深度分析报告

数据来源:麦可思《2025年中国本科生就业报告》、西安电子科技大学/电子科技大学/华中科技大学/同济大学/北京邮电大学/上海科技大学2025届就业质量报告、职友集、新东方在线、凤凰网、皮书网等公开平台 更新时间:2026年4月一、行业总览:电子信…...

ReplaceItems.jsx:Adobe Illustrator智能对象替换脚本的技术架构与行业应用深度解析

ReplaceItems.jsx:Adobe Illustrator智能对象替换脚本的技术架构与行业应用深度解析 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 在当今设计工作流中,重复…...

【CAPL实战】LIN校验和自动化测试:从函数解析到脚本验证

1. LIN校验和的核心概念与CAPL函数解析 第一次接触LIN总线校验和测试时,我也曾被各种专业术语绕得头晕。简单来说,校验和就像是给数据包贴上的"防伪标签"——当LIN报文从主机发往从机时,这个标签能帮我们确认数据在传输过程中是否…...

如何构建跨平台漫画阅读器Venera:从零开始实现本地与网络漫画管理

如何构建跨平台漫画阅读器Venera:从零开始实现本地与网络漫画管理 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 作为一名漫画爱好者,你是否曾为找不到合适的阅读工具而烦恼?本地漫画文件…...

产品经理的AI内功:如何用‘协议思维’和‘框架地图’跟技术团队高效沟通?

产品经理的AI内功:用协议思维与框架地图驱动技术协作 当产品经理第一次走进AI项目会议室,技术团队的白板上写满了"微服务架构""RESTful API""LangChain调度逻辑"等术语时,很多人会陷入两种极端——要么完全放…...

QMCDecode终极指南:3步解锁QQ音乐加密文件的完整解决方案

QMCDecode终极指南:3步解锁QQ音乐加密文件的完整解决方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默…...

qobuz-dl:无损音乐下载的技术革命与实践指南

qobuz-dl:无损音乐下载的技术革命与实践指南 【免费下载链接】qobuz-dl A complete Lossless and Hi-Res music downloader for Qobuz 项目地址: https://gitcode.com/gh_mirrors/qo/qobuz-dl 在数字音乐时代,音乐爱好者面临着一个永恒的矛盾&…...

Ostrakon-VL模型压缩与量化实战:在消费级GPU上的部署优化

Ostrakon-VL模型压缩与量化实战:在消费级GPU上的部署优化 1. 为什么需要模型压缩与量化 当你第一次尝试在消费级GPU上运行Ostrakon-VL这样的视觉语言大模型时,可能会遇到显存不足或推理速度过慢的问题。这就像试图用家用轿车运送重型建筑材料——虽然理…...

汇川PLC编写,设备状态机的实现以及实际案例使用,针对设备的多种状态进行区分,有单独状态和叠加...

汇川PLC编写,设备状态机的实现以及实际案例使用,针对设备的多种状态进行区分,有单独状态和叠加态的实现方式在工业自动化项目里,设备状态机就像给机器装了个智能开关板。最近调试包装产线时发现,设备动不动就卡在"…...

vokoscreenNG完全指南:开源屏幕录制工具的全方位应用手册

vokoscreenNG完全指南:开源屏幕录制工具的全方位应用手册 【免费下载链接】vokoscreenNG vokoscreenNG is a powerful screencast creator in many languages to record the screen, an area or a window (Linux only). Recording of audio from multiple sources i…...

电动汽车电池充电数据实战:29个月20辆车电池衰减深度解析

电动汽车电池充电数据实战:29个月20辆车电池衰减深度解析 【免费下载链接】battery-charging-data-of-on-road-electric-vehicles This repository is transfered from the personal account of Dr. Zhognwei Deng (Michael Teng) 项目地址: https://gitcode.com/…...

GitHub趋势-AI工具链生态

GitHub 2026年4月开源趋势:AI工具链正在形成完整生态分类:开源社区 / 开发工具 / GitHub趋势 标签:GitHub 开源 AI工具 Claude Code TypeScript一、数据背景 本文基于 2026 年 4 月 5 日 GitHub 实时趋势榜单数据(来源&#xff1a…...

从树莓派到旧笔记本:利用Ubuntu 16.04 + CH340打造你的低成本硬件调试终端

从树莓派到旧笔记本:打造高性价比硬件调试终端的完整指南 在创客和硬件开发的世界里,调试工具的重要性不亚于开发板本身。想象一下:当你正在为一个物联网项目调试ESP32,或者为机器人项目编写Arduino代码时,一个稳定可靠…...

基于R语言的自动数据收集:网络抓取和文本挖掘实用指南【1.4】

2.3.11 表格标签<table>、<tr>、<td>和<th>下一组元素让HTML能够显示表格。查看一下表2-2&#xff0c;并把它和如下所示的HTML对应表示进行比较。我们用<table>标签来产生一个表格。我们用<tr>产生一个新行。在<tr>内部&#xff0c;…...

【数据集】SOCAT-表层海洋二氧化碳逸散度(fCO₂)观测数据

目录 数据概述 数据下载 参考 数据概述 1. 数据背景与意义 宏观背景(SOCAT):SOCAT(Surface Ocean CO₂ Atlas)是国际海洋碳研究界的一项核心数据综合项目,汇集了全球经过严格质量控制的表层海洋二氧化碳逸散度(fCO₂)观测数据。该项目受到全球海洋观测系统(GOOS)的认…...

5分钟掌握ArchivePasswordTestTool:轻松找回遗忘的压缩包密码

5分钟掌握ArchivePasswordTestTool&#xff1a;轻松找回遗忘的压缩包密码 【免费下载链接】ArchivePasswordTestTool 利用7zip测试压缩包的功能 对加密压缩包进行自动化测试密码 项目地址: https://gitcode.com/gh_mirrors/ar/ArchivePasswordTestTool 你是否曾遇到过这…...

保姆级教程:用阿里云物联网平台给你的ESP32实现远程OTA升级(Arduino/PlatformIO通用)

ESP32远程OTA升级实战&#xff1a;基于阿里云物联网平台的完整解决方案 想象一下这样的场景&#xff1a;你开发的智能家居设备已经部署在用户家中&#xff0c;突然发现一个关键漏洞需要紧急修复。传统方式需要用户手动下载固件或返厂升级&#xff0c;而远程OTA&#xff08;Ove…...

网盘直链下载助手:免费开源的跨平台云存储加速工具

网盘直链下载助手&#xff1a;免费开源的跨平台云存储加速工具 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

效率提升秘籍:在PyTorch-2.x-Universal-Dev环境里,这样用pyyaml和requests最省事

效率提升秘籍&#xff1a;在PyTorch-2.x-Universal-Dev环境里&#xff0c;这样用pyyaml和requests最省事 1. 引言&#xff1a;为什么这两个库值得关注 在深度学习项目开发中&#xff0c;我们常常把注意力集中在模型架构和训练算法上&#xff0c;却忽略了两个看似简单但极其重…...