☰
模式识别中的马尔可夫链与隐马尔可夫模型:从转移矩阵到序列解码
2026/11/2 7:06:15 网站建设 项目流程

简介:《模式识别》电子书PDF版配套讲义面向人工智能、机器学习初学者及模式识别课程学习者,用于系统梳理马尔科夫模型与隐马尔可夫模型的核心知识框架。资源包内共1个PPT文件,整体约5.79MB,以幻灯片形式组织章节要点、概念定义、概率矩阵与实例图示,便于课堂展示或自学时按页查阅。内容从马尔科夫性、马尔科夫链与马尔科夫过程切入,说明转移概率矩阵中Pij的含义及齐次链的判定,并展开隐马尔可夫模型的状态、观察值、转移概率与观察值概率等要素;同时结合语音识别、图像识别、自然语言处理和生物信息学等应用场景,借助缸中彩球抽取的经典实验解释观察值序列的生成方式与“缸间转移不可直接观察”等约束。已有1593人学习,适合需要快速建立HMM概念脉络、对照课件复习模式识别基础的读者。

1. 从「看一眼就认出来」说起:模式识别到底在解决什么问题

早上出门,你能在人群里一眼认出熟人;听半句话,就知道是谁在说话。这件事对人来说毫不费力,可换成机器,就变成了一个正经的研究课题——模式识别。通俗地说,模式识别就是让机器从一堆原始数据里找出规律,再给它们分门别类:这段声音属于哪个人,这张图里是猫还是狗,这串观测背后藏着什么状态。它关心的不是某一次判断有多准,而是「同类的东西为什么能被认成同类」这件事本身有没有一套可复用的方法。搞懂这条主线,再看模式识别电子书里那些看着吓人的公式,就不会觉得是在看天书了。

2. 马尔可夫性:为什么「将来只和现在有关」

模式识别处理的数据,很大一部分是「有顺序」的:一段语音是一帧接一帧的,一段文本是一个词接一个词的,一段监控是一秒接一秒的。描述这类数据有个天然难题——序列越长,可能的组合就越多,把所有历史都塞进模型,参数量会直接失控。马尔可夫性就是第一次「剪枝」:它不打算记住全部历史,只打算记住「此刻在哪」。这一刀砍下去,很多原本算不动的问题突然就能算了,代价是模型变「健忘」了。

2.1 「健忘」的过程:一句话说清马尔可夫性

按模式识别电子书里的说法,如果一个过程的「将来」仅依赖「现在」而不依赖「过去」,这个过程就具有马尔可夫性,也叫马尔可夫过程。写成式子就是 X(t+1) = f( X(t) )——下一时刻的状态,只由当前时刻的状态决定,再往前的信息一概不问。

打个比方:你下班开车回家,堵不堵主要看此刻这条路的路况。你不需要把早上八点出门时走的是哪条街、中午去过哪里全部回忆一遍,才能判断下一个路口顺不顺。当前路况这一个变量,已经把「接下来会怎样」的大部分信息装进去了。

这里要强调一句:马尔可夫性是假设,不是定理。它说的是「我们决定这样建模」,而不是「世界本来就是这样」。现实里很多事情明显不满足它,比如一个人说话,前面说过的话会影响后面说什么,长距离的依赖是存在的。所以这个假设用起来要小心,它换来的是计算上的极大简化,付出的是对长期记忆的丢失。工程上大量模型是「先假设它成立,再看效果」,效果好就留着,效果差就换更复杂的结构。

为什么这个假设这么值钱?因为状态的取值是有限的、可枚举的,把整段历史压成一个当前状态之后,模型要存的参数从「随序列长度指数膨胀」变成「一张固定的表」。这张表就是后面要讲的转移概率矩阵。

2.2 从马尔可夫过程到马尔可夫链:离散化之后世界变简单了

马尔可夫过程是个大筐,时间和状态都可以是连续的。而马尔可夫链是它最规矩的一个特例:时间和状态都离散。教材里的记法是 {Xn = X(n), n = 0,1,2,…},意思是我们在时间点 0、1、2、3……上,对这个过程做一次次观察,得到一个状态序列。状态空间记作 I = {a1, a2, …},也就是所有可能状态的集合,数量有限、一个个能数出来。

「离散」这两个字要拆开看:时间离散,是说我们只在固定节拍上取一次样,比如每天记录一次天气;状态离散,是说状态只能落在几个固定的格子里,比如只允许「晴、阴、雨」三种,不允许「半晴半阴 37.5%」这种中间态。两个条件都满足,才叫马尔可夫链。

链的核心是一个条件概率:Pij(m, m+n) = P{ Xm+n = aj | Xm = ai }。读出来就是——已知第 m 个时刻处在状态 ai,那么第 m+n 个时刻落到状态 aj 的概率是多少。这里 m 是起点,n 是跨了几步,i 和 j 分别是起点和终点的状态编号。

链上还分「齐次」和「非齐次」。当上面这个概率和起始时刻 m 无关,只跟「隔了几步」有关时,就叫齐次马尔可夫链。通俗地说,就是转移规律不随日历翻页而改变:今天从晴天转阴天的概率,和下个月从晴天转阴天的概率是同一个数。平时说的马尔可夫链,默认都是指齐次马尔可夫链,因为一旦允许规律随时间漂移,参数就变成无穷多个,根本没法估。

2.3 转移概率矩阵:把一张状态图压缩成一张表

把所有两两之间的转移概率排成方阵,就是转移概率矩阵。模式识别电子书里给了一个天气的例子,直接搬过来最清楚:

今天 \ 明天晴天阴天下雨
晴天0.5000.2500.250
阴天0.3750.2500.375
下雨0.2500.1250.625

读法是按行读:第一行说的是「今天晴天」的前提下,明天是晴、阴、雨各自的概率;第二行换成「今天阴天」,第三行换成「今天下雨」。行是起点,列是终点,这个方向千万别记反。

这张表有个硬性约束:每一行加起来必须正好等于 1。道理很朴素——从任何一个状态出发,下一刻必然转移到所有可能状态中的某一个,概率总和当然是 1。原文里那个求和式表达的就是这件事。如果某一行加起来是 0.9 或者 1.1,那不是模型有性格,是写错了。

用一小段代码就能把这件事验一遍,顺手算算「隔两天」的转移概率:

import numpy as np # P[i][j]:今天处于状态 i,明天转到状态 j 的概率 P = np.array([ [0.500, 0.250, 0.250], # 晴天 -> 晴 / 阴 / 雨 [0.375, 0.250, 0.375], # 阴天 -> 晴 / 阴 / 雨 [0.250, 0.125, 0.625], # 下雨 -> 晴 / 阴 / 雨 ]) print(P.sum(axis=1)) # 每行之和,正常应输出 [1. 1. 1.] print(np.linalg.matrix_power(P, 2)) # 两步转移:从今天直接看到后天

axis=1表示按行求和,用来做自检;matrix_power(P, 2)是矩阵自乘一次,结果的第 i 行第 j 列就是「今天状态 i,隔两步之后落到状态 j」的概率。这个自乘不是随便写的,它对应一句直观的话:走两步的所有中间路线,把概率各自乘起来再加总,正好等于矩阵乘法的定义。想算三步就自乘两次,以此类推。

实际建模时,这类矩阵最常见的错误不是算错,而是漏状态:本来有三种状态,只写了两种的转移,剩下那一份概率无处安放,行和就对不上。我见过不止一次有人盯着一个「概率总和 0.95」的矩阵查了半天代码,最后发现是状态表少了一个类别。

3. 隐马尔可夫模型:看得见的是球,看不见的是缸

马尔可夫链有个隐含前提:状态是能直接看见的。今天晴天还是下雨,抬头就知道。可现实里大量场景不是这样——你听到的是声波,看不到发音器官的动作;你看到的是屏幕上的像素,不知道图像背后的物体类别。状态明明存在,却躲在幕后。隐马尔可夫模型就是为这种「看得见结果、看不见原因」的局面准备的。

3.1 双重随机过程:HMM 为什么比马尔可夫链多一层

模式识别电子书里对它的概括很干脆:HMM 的状态是不确定或不可见的,只有通过观测序列的随机过程才能表现出来;观察到的事件与状态并不是一一对应,而是通过一组概率分布相联系。因此它是一个双重随机过程,由两部分叠起来:

一层是马尔可夫链,负责描述状态之间怎么转移,用转移概率刻画;另一层是一般随机过程,负责描述状态和观察值之间的关系,用观察值概率刻画。

打个比方,想象你隔着一层帘子,听另一个人在屋里从几个坛子里抓球。你能听见他每次报出的颜色:红、蓝、红、红、蓝……但你不知道他这一次伸进的是哪个坛子,也不知道坛子之间是怎么换的。坛子的切换有自己的规律(马尔可夫链那一层),每个坛子里各种颜色的球比例不同(观察值概率那一层),两层随机性叠在一起,最后只把颜色序列交到你手上。

这就是它比马尔可夫链「多一层」的地方:链只回答「下一个状态是什么」,HMM 要同时回答「下一个状态是什么」和「这个状态会吐出什么样的观察值」。多出来的这一层让模型更贴近现实,也让计算难度上了一个台阶——你手上的数据只是一串颜色,要反推坛子序列,中间隔着一层看不见的东西。

3.2 缸和球的实验:把 HMM 五个要素摆到桌面上

原文用的是一个很经典的实验设定,值得一步一步走一遍。设有 N 个缸,每个缸里装了很多彩球,球的颜色由一组概率分布描述。实验这样进行:

  1. 根据初始概率分布,随机选中 N 个缸中的一个,作为起点;
  2. 按这个缸里球颜色的概率分布,随机摸出一个球,记下颜色为 O1,然后把球放回缸中;
  3. 按描述缸之间转移的概率分布,随机选出下一个缸,重复上一步;
  4. 最后得到一串颜色 O1, O2, …,这就是观察值序列 O。

把这个过程拆成参数,其实就五样东西,缺一不可:

要素含义在缸球实验里对应什么
状态数 N隐藏状态一共有几个一共有几口缸
观察值集合可能观测到什么球可能有哪几种颜色
初始分布第一步落在各状态的概率一开始选中每口缸的概率
状态转移矩阵状态之间怎么换从这口缸换到那口缸的概率
观察概率每个状态吐出各种观察值的概率每口缸里各色球的比例

第 2 步里「把球放回缸中」这个动作,很多人读的时候一扫而过,其实它是整个模型能成立的关键。放回,意味着每口缸的颜色比例在实验过程中保持不变,每次摸球的概率分布是同一套;如果不放回,摸走一个红球,缸里红球就少一个,下次摸到红的概率就变了,观察概率会随时间漂移,模型立刻复杂一大截。所以这个细节不是多余的礼貌,而是模型假设的一部分。

3.3 三条约束:为什么缸不能被直接看见

原文特意点出了这个实验的三条约束,值得逐条掰开:

第一条,不能被直接观察缸间的转移。你能看到的只有颜色,看不到手伸向了哪个缸。这正是「隐」字的来源。

第二条,从缸中所选取的球的颜色和缸并不是一一对应的。如果一一对应——红球必来自一号缸、蓝球必来自二号缸——那么看一眼颜色就知道缸,隐藏状态当场暴露,问题退化成普通的马尔可夫链,HMM 也就没有存在的必要了。正因为有交叉,才需要靠概率去推断。

第三条,每次选取哪个缸由一组转移概率决定,而不是临时随便挑。也就是说,缸的切换本身是有规律的随机过程,不是无规律的乱跳。

这三条约束放在一起,构成了 HMM 的「难点」也是「价值点」。举个真实感强一点的例子:做语音识别时,发音的口型、舌位这些「状态」是看不见的,能被麦克风录下来的只有波形;同一个音可能对应不同波形,不同音也可能长得像。这跟「看不见缸、球色与缸不一一对应、换缸有概率规律」是同一个结构。也正因如此,HMM 才会被用在语音识别、图像识别、自然语言处理、生物信息学这些领域——它们的共同点是:真正想知道的那个东西藏着,手上只有它的「影子」。

4. HMM 里的三类问题:评估、解码、学习

模型摆好了,接下来自然要问:拿它能算什么?教材里通常把 HMM 的用法归成三类问题,名字听起来唬人,其实每一类都对应一个人话版本的提问。

4.1 评估:这串观察值出现的可能性有多大

第一个问题是:给定一套参数,某串观察值出现的概率是多少。比如手上有几套不同的模型参数,分别代表几种可能的场景,然后来了一串新的颜色序列,想知道它更像哪一套。比较的依据就是「在这套参数下,这串观察值出现的概率」,谁算出来大,就认为谁更合理。

难点在于不能硬算。要算这串观察值的概率,得把所有可能的隐藏状态路径都考虑进去——每一种走法贡献一份概率,全部加起来才是答案。状态一多、序列一长,路径数量就是天文数字,直接枚举必然崩。教材给出的解法是递推:从左往右一步一步走,每一步只保留「走到当前位置、且此刻处在某个状态」的累计概率,下一步在这批数上继续推。这样计算量就从指数级降到跟序列长度成正比。

这套递推在很多教材里有个专门的名字(前向算法),名字不必背,思路值得记:把「把所有路径加起来」改写成「一层一层往前推」。这类「用递推换掉枚举」的技巧,在模式识别里反复出现,认得它就够用了。

4.2 解码:最可能的隐藏状态序列是哪条

第二个问题更贴近直觉:观察值我有了,参数我也有,那最可能的隐藏状态序列是什么?回到缸球实验,就是你听了一串颜色,想猜对方依次摸的是哪几口缸。语音识别里,这一层对应的就是从声波反推音素序列。

这里最容易踩的坑是贪心:每一步都选当前概率最大的状态。听起来合理,实际上经常翻车。因为某一步看起来最像的状态,可能和下一步根本接不上——转移概率极低,整条路径的概率被拖垮。局部最优不等于全局最优,这是血泪级的常识。

稳妥的做法是动态规划:走到每一步时,对每一个可能的当前状态,记下「以它为结尾的最佳路径」及其累计概率;走到下一步时,只在这批「最佳前缀」上延伸,而不是把所有历史路径重新翻一遍。这样每一步的计算量是状态数的平方量级,整条最优路径最后再回溯出来。教材里管这个叫维特比算法,同样,名字不必记,记住「保住每一步的最优前缀,最后回溯」这个动作就行。

4.3 学习:参数从哪里来

第三个问题是:转移矩阵、观察概率、初始分布这些数字,究竟从哪儿来?答案分两种情形。

一种是有标注数据:每一段观察值都知道对应的隐藏状态序列。这时候统计就行——数一数从状态 i 转到状态 j 出现了多少次,除以从 i 出发的总次数,就是转移概率的估计;再数一数状态 i 吐出观察值 k 的次数,除以状态 i 出现的总次数,就是观察概率的估计。直白得像数豆子。

另一种是没有标注数据,只有一串串观察值,隐藏状态完全不知道。这才是常态,也是难点。这时候只能靠迭代:先随便给一组初始参数,用它推断每条观察值背后「大概」是什么状态序列,再用推断出来的序列重新统计参数,然后再推断、再统计,一轮一轮磨。这套做法的脾气很像玄学——对初值敏感,容易停在局部最优,迭代几十轮后数值不再明显变化就收手。有人抱怨「同一个模型跑两次结果不一样」,多数时候就是初值不同导致的。

还有一个绕不开的人为选择:状态数 N 设几个。这个数不是从数据里自动学出来的,得人来定。设少了,模型表达不了真实结构;设多了,参数爆炸、过拟合,训练集上漂亮、新数据上崩盘。实践中常见的做法是拿几个不同的 N 各跑一遍,看哪个在验证数据上表现稳。

5. 常见误区:马尔可夫过程、马尔可夫链和 HMM 到底差在哪

这几个词在教材里经常前后脚出现,长得又像,初学的时候混成一团很正常。下面四条是最容易拧巴的地方,逐条拆开。

5.1 误区一:把马尔可夫过程和马尔可夫链混着叫

易混点:两个名字只差一个字,定义里又都出现「马尔可夫」,很多人读到后面就默认它们是同一件事。

为什么混:因为马尔可夫链确实是马尔可夫过程的一种,逻辑上是包含关系。教材先讲过程、再讲链,中间只隔了几行字,很容易读串。

怎么区分:看时间和状态是不是都离散。马尔可夫过程是个宽泛的筐,时间可以连续、状态也可以连续,只要满足「将来只依赖现在」就算;马尔可夫链是其中时间和状态双双离散的特例,而且一旦离散,就能写成转移概率矩阵,能算。一个判断口诀:能画成一张「行是今天、列是明天」的表,就是链;画不出来,只是过程。

5.2 误区二:把观察值当成状态

易混点:在缸球实验里,球色是观察值,缸是状态。有人做着做着就开始用球色去代表缸,把两者当成一回事。

为什么混:因为观察值太好用、太显眼了,数据里就它看得见,而状态是虚的,脑子里没有实体抓手,自然就抓了看得见的那个。

怎么区分:问一句「这个东西我是不是直接测到的」。直接测到的是观察值,测不到、要靠推断的是状态。原文那条约束说得很清楚:球的颜色和缸不是一一对应的。如果一一对应,两者可以互换;一旦不一一对应,把它们混同就等于把模型的整个价值抹掉了。做语音识别时尤其容易犯这个错: waveform 是观察值,音素是状态,把波形当成音素去数,后面全都错。

5.3 误区三:把转移概率和观察概率搞反

易混点:两个都是概率,都写成矩阵,都跟状态有关,经常在写代码时把行列含义对调。

为什么混:因为它们描述的是同一批状态的两个不同侧面,而且很多教材为了排版紧凑,两个矩阵挨着放,形状还都是二维的。

怎么区分:看这个概率「跨不跨状态」。转移概率描述的是状态到状态的跳转,行是起始状态、列是目标状态;观察概率描述的是某个状态吐出某个观察值的可能性,行是状态、列是观察值。一句话记:转移概率的列还是状态,观察概率的列是你能看见的东西。写代码时把两个矩阵的行列注释清楚,能省掉大量排查时间。

5.4 误区四:以为隐藏状态一定「有意义」

易混点:很多人以为 HMM 学出来的每个状态都能对应到一个具体、可命名的东西,比如「这是元音 a」「这是元音 i」。

为什么混:教学例子里的缸、晴雨、音素都太干净了,容易让人以为状态天生自带标签。

怎么区分:状态是模型内部造出来的中间变量,它的含义是训练过程「分配」出来的,不是世界直接给的。用无标注数据学出来的状态,很可能只是一个统计上的聚类,你能说清它对应的观察值分布长什么样,却未必能给它起一个漂亮的名字。这不影响它有用——只要能提升预测效果,这个状态就有存在价值。反过来,如果强行给每个状态安一个解释,往往是在自欺。

6. 什么时候用 HMM,什么时候别轻易使用

判断能不能用,其实就三个问题:状态看不看得见、状态之间有没有转移规律、样本够不够。

情形是否适合原因
状态隐藏、只能观测到间接信号,且信号有先后顺序适合正好对上双重随机过程的结构
状态可以直接测到不适合直接建马尔可夫链就够,多一层是浪费
观察值之间强烈依赖很久以前的信息谨慎马尔可夫性假设会被打破,长程依赖容易丢
样本极少、状态数都定不下来不适合参数估不准,迭代学习容易停在无意义的结果上
只做一次性分类、数据没有顺序不适合没有序列结构,HMM 的优势用不上

举个具体的例子。假设要做一个手势识别的小系统,摄像头拍到的是手部轮廓的一串帧,想判断做的是「挥手」「画圈」还是「握拳」。状态可以设成几个手势阶段,观察值是每帧提取出来的轮廓特征。这个场景符合条件:阶段看不见、帧有先后、阶段之间有转移规律。但如果改成对一批静态照片分类,每张照片彼此独立、没有时间顺序,那用 HMM 就是拿锤子拧螺丝——换成普通的分类模型更省事。

还有一种情况要格外小心:序列很长,而且真正起作用的信息隔得很远。比如一段几分钟的语音,开头的信息影响结尾的判断。标准 HMM 的马尔可夫性在这一刻就成了短板,硬套上去,模型会「忘事」。这种时候要么缩短序列分段处理,要么换用能记住更长历史的模型,不要指望调参数能救回来。

我第一次拿 HMM 做序列任务时,栽在一个特别蠢的地方:状态数凭感觉设了 3 个,训练集上的指标好得离谱,换一批数据直接崩了。后来才明白,那不是模型学得好,是它把训练样本背下来了。从那以后我每次拿到一串序列数据,都强制自己先走一遍这三个问题:状态看得见吗、状态之间会不会互相影响、样本够不够撑起这个状态数。三个都答完了,再决定要不要上 HMM,以及状态数到底定几个。这套笨办法救过我不少次,也希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询