简介:围绕模式识别核心知识整理的PPT课件,面向人工智能、机器学习初学者及需要补充概率模型基础的读者,重点解决马尔科夫模型与隐马尔科夫模型概念抽象、公式与实例难以对应的问题。课件从马尔可夫性、马尔科夫链及转移概率矩阵讲起,延伸到隐马尔科夫模型的状态、观察值、转移概率与观察值概率,并用彩球抽缸实验说明观察序列的生成过程,同时点明缸间转移不可直接观察、球色与缸非一一对应等约束,帮助读者建立双重随机过程的理解框架。资源包共1个文件,为PPT格式,压缩包约5.79MB,便于直接打开阅读和课堂演示。目前已有1593人学习,适合用作课程预习、复习提纲或模式识别入门前置材料,也可为语音识别、图像识别、自然语言处理等应用方向提供概念铺垫。
1. 从“看云识天气”说起:模式识别到底在做什么
天边压过来一片乌青的云,风忽然转凉,空气里飘着土腥味,你抬头看一眼就冒出一句“要下雨了”。这一幕里,人脑干的事就是把零散的信号拼成一个整体印象,再把它归进“下雨”这一类。模式识别研究的就是让机器也走一遍这条路:从一堆样例里把规律摸出来,再拿规律去判断新来的东西属于哪一类。它听起来像玄学,其实是方法论。要让机器判断得靠谱,就得给“规律”找个数学模型,马尔可夫模型就是其中很经典的一支。
2. 马尔可夫性:为什么“只管现在”反而是种本事
很多人第一次接触序列数据,直觉是“历史越长,判断越准”,于是把过去所有信息一股脑塞进模型。真这么做往往很快就卡住:序列一长,要记录的历史就爆炸式增长,算不动也存不下。马尔可夫模型给的是另一个方向——大胆地把历史砍掉,只留“现在”。这个看起来粗暴的假设,恰恰是它能被工程用起来的原因。
2.1 一句话说清马尔可夫性:将来只认现在
资料里给的定义很干净:如果一个过程的“将来”仅依赖“现在”而不依赖“过去”,这个过程就具有马尔可夫性,也叫马尔可夫过程,可以写成 X(t+1) = f(X(t))。翻译成人话,就是下一步长什么样,只由当前这一步决定,之前怎么走过来的不重要。
打个比方,你在一个陌生城市里找路。站在某个路口,你下一步往哪拐,只看你现在站在哪个路口、面前有哪些岔路,跟你半小时前从哪条巷子绕过来没有关系。这个“只认当前位置”的设定,就是马尔可夫性。它把一整条历史压缩成一个当前状态,模型的复杂度立刻降下来了。
这个假设当然不是永远成立。比如人的情绪,今天心情差可能是因为昨天受了气,昨天又和前天有关,这种长记忆过程硬套马尔可夫性就会失真。反过来,很多真实序列的“记忆”衰减得很快,只保留当前状态已经足够好用,这时候马尔可夫性就不是偷懒,而是合理的近似。
值得强调的是,马尔可夫性描述的是一个过程的性质,不是某个具体模型的名字。一个过程可以有马尔可夫性,也可以没有;可以近似看作有,也可以严格证明没有。判断标准只有一条:将来是否只由现在决定。
2.2 从马尔可夫过程到马尔可夫链:把连续世界切成格子
马尔可夫过程是个大筐,时间和状态的取值是连续还是离散,决定了筐里装的是哪一种。资料里说得很明确:时间和状态都离散的马尔可夫过程,叫马尔可夫链,记作 {Xn = X(n), n = 0,1,2,…},它是在时间集 {0,1,2,…} 上对一个离散状态过程连续观察的结果。状态空间记作 I = {a1, a2,…},每个 ai 是一个具体状态。
条件概率 Pij(m, m+n) = P{Xm+n = aj | Xm = ai},意思是“在时刻 m 处于状态 ai 的条件下,到时刻 m+n 转移到状态 aj 的概率”,这个量叫转移概率。当它跟 m 无关时,链就叫齐次马尔可夫链,平时说的马尔可夫链通常都指齐次这一种。
“齐次”两个字值得多停一秒。它的意思是转移规律不随时间漂移:今天的晴天转阴天概率是 0.25,明年今天还是 0.25。现实里当然会有季节变化,但在一个较短的时间窗口内把它当作不变,往往够用。
用格子来理解最直观:连续时间的马尔可夫过程像一条流动的河,你随时可以取一个点;马尔可夫链则像棋盘,你只能在整数时刻站在某几个固定格子上,一步一格地挪。语音采样、文本分词、用户每天的行为状态,天然就是这种“按格子走”的形态,所以链在实际问题里出现得更多。
2.3 转移概率矩阵:把“下一步去哪”写成一张表
有了状态和转移概率,接下来要把它们摆成一张能算的表,这就是转移概率矩阵。资料里给了一个天气的例子,三个状态是晴天、阴天、下雨:
| 今天\明天 | 晴天 | 阴天 | 下雨 |
|---|---|---|---|
| 晴天 | 0.50 | 0.25 | 0.25 |
| 阴天 | 0.375 | 0.25 | 0.375 |
| 下雨 | 0.25 | 0.125 | 0.625 |
读法是“行是今天,列是明天”。第一行第一列的 0.50 表示今天晴、明天还晴的概率是 0.5;第一行第三列的 0.25 表示今天晴、明天下雨的概率是 0.25。整行加起来必须等于 1,因为从任何一个状态出发,下一步必然落到某个状态上,没有“哪儿都不去”这个选项。资料里那个求和公式表达的就是这件事。
下面用几行代码把这张表验一遍,顺便看看它在程序里长什么样:
import numpy as np # 行 = 今天的状态,列 = 明天的状态,顺序固定为 晴天、阴天、下雨 P = np.array([ [0.500, 0.250, 0.250], # 今天晴天,明天三种天气的概率 [0.375, 0.250, 0.375], # 今天阴天,明天三种天气的概率 [0.250, 0.125, 0.625], # 今天下雨,明天三种天气的概率 ]) # 齐次马尔可夫链要求每一行的概率之和为 1 print(P.sum(axis=1)) # 期望输出 [1. 1. 1.] # 已知今天是阴天,问明天最可能是哪种天气 print(P[1].argmax()) # 输出 0 或 2,两个 0.375 并列最高这里有两个参数要留意。axis=1表示按行求和,不是按列;按列求和会得到“明天是晴天的总概率”,两者含义完全不同,这是初学者最容易写反的地方。argmax()返回的是最大概率所在的下标,配合前面约定的状态顺序,0 是晴天、1 是阴天、2 是下雨,结果才读得懂。如果状态顺序没有统一约定,同一份矩阵在不同人手里会得出相反的结论。
这张表的价值在于:它把“天气怎么变化”这件模糊的事,压缩成九个数字。有了矩阵,一步转移可以查表,两步转移可以把矩阵自乘一次,多步之后还能观察分布会不会稳定下来。矩阵不大,但它承载的是整个系统的动态规律,这也是它被称为马尔可夫链核心参数的原因。
3. 隐马尔可夫模型:状态看不见了,还能算吗
马尔可夫链有个前提——你站在哪个格子上,自己是知道的。天气例子之所以好讲,就是因为“今天是晴是雨”这件事摆在明面上。可现实里大量场景不是这样:你知道发生了什么,却不知道背后处在什么状态。隐马尔可夫模型就是为这种局面准备的。
3.1 摸彩球实验:一个能装进脑袋的 HMM
资料里用一个摸彩球实验把 HMM 讲得很透。设有 N 个缸,每个缸里装很多彩球,球的颜色由一个概率分布描述。实验这样进行:先按初始概率分布随机选中 N 个缸中的一个开始;再按这个缸里球颜色的概率分布随机摸一个球,记下颜色 O1,把球放回;然后按缸之间的转移概率分布随机选下一个缸;重复上述步骤,最后得到一串颜色 O1, O2, …,称为观察值序列 O。
这个实验有三条约束,每一条都很关键:缸与缸之间的转移不能被直接观察;摸出来的球颜色和缸不是一一对应的;每次选哪个缸由一组转移概率决定。
打个比方,有点像朋友在帘子后面换杯子,你看不见他手里拿的是第几个杯子,只能看见他每次倒出来的是什么颜色的球。你手里唯一的信息就是那串颜色。这个帘子,就是 HMM 里那个“隐”字。
缸就是状态,球的颜色就是观察值。状态在幕后,观察值在台前,两者通过概率联系起来,而不是通过固定规则对应。理解到这一层,后面那些术语就不会打架了。
3.2 双重随机过程:HMM 的“隐”究竟隐在哪
资料对 HMM 的定义只有一句话,但信息量很大:HMM 是一个双重随机过程,由两部分组成。一部分是马尔可夫链,描述状态的转移,用转移概率描述;另一部分是一般随机过程,描述状态与观察序列之间的关系,用观察值概率描述。状态是不确定或不可见的,只有通过观测序列的随机过程才能表现出来。
“双重”这个词是理解 HMM 的钥匙。第一重随机发生在状态层面:下一个状态是哪个,由转移概率决定,本身带随机性。第二重随机发生在观察层面:确定了状态之后,会观察到什么,也不是固定的,而是由该状态下的观察值概率决定。
对照摸彩球实验,第一重是“下一个选哪个缸”,第二重是“从这个缸里摸出什么颜色的球”。两层随机叠在一起,你看到的序列才会显得既有点规律又说不准。
这也是 HMM 和普通马尔可夫链的分水岭。普通马尔可夫链只有一重随机,状态看得见,观察就是状态本身。HMM 把状态藏到幕后,多加了一层从状态到观察的映射,于是同一串观察值可能由好几条不同的状态路径产生。
用一句话概括:HMM 关心的不是“我看到了什么”,而是“我看到这些东西,背后最可能是怎样一条状态路径”。前者是记录,后者是推断,两者难度完全不同。
3.3 状态与观察值:颜色不是缸的身份证
把 HMM 的几个核心词摆在一起对照,边界会清楚很多。状态是系统内部的处境,可以是离散的也可以是连续的,在摸彩球实验里就是“当前用的是第几号缸”。观察值是从系统外部能记录到的量,同样可离散可连续,在实验里就是球的颜色。转移概率管的是状态与状态之间怎么跳。观察值概率管的是某个状态会以多大概率产生某个观察值。
这四个词里,最容易被忽略的是观察值概率。很多人下意识觉得“看到红球就说明是某个缸”,可实验的约束明说了:球的颜色和缸不是一一对应。一个缸里可能既有红球也有蓝球,只是比例不同;两个不同的缸也可能都能摸出红球。颜色只能提供证据,不能给出身份。
下面这张表把马尔可夫链和 HMM 放在一起看:
| 对比项 | 马尔可夫链 | 隐马尔可夫模型 |
|---|---|---|
| 状态是否可见 | 可见,状态就是观察 | 不可见,只能间接推断 |
| 随机过程层数 | 一层,状态转移 | 两层,状态转移加观察生成 |
| 核心参数 | 转移概率 | 转移概率、观察值概率、初始分布 |
| 输入输出关系 | 观察即状态序列 | 观察序列推出隐藏状态序列 |
这张表最该记住的是第一行。状态可见与否,决定了你手上是马尔可夫链还是 HMM,而不是由数据长得像不像序列决定的。很多误用就出在这里:拿到一串观察值就往上套 HMM,却没问过自己“我关心的那个状态,到底看得见吗”。
4. 四个容易翻车的混淆点:马尔可夫链与 HMM 的边界
概念一多,边界就容易糊。下面这四个混淆点,是初学阶段最容易踩坑的地方,每一个都值得单独拎出来说清楚。
4.1 误区一:把马尔可夫性和马尔可夫链当成同义词
易混点在于,两个词都带“马尔可夫”,读起来像同一件事的两种叫法。会混是因为教材常常先讲马尔可夫性,紧接着就讲马尔可夫链,中间没有明显停顿,读者容易把它们并成一个概念。
区分方法看层级:马尔可夫性是一种性质,描述的是一种“将来只依赖现在”的假设,它既可以用在离散过程上,也可以用在连续过程上;马尔可夫链是一个具体模型,要求时间和状态都离散,并且满足马尔可夫性。性质是条件,链是满足条件的模型之一,两者不是同一层级的东西。说“这个序列具有马尔可夫性”是在描述特征,说“这是一个马尔可夫链”是在指认对象,混着用会让后面的推导失去前提。
4.2 误区二:把转移概率和观察值概率搅成一团
易混点在于,两者都叫“概率”,都在描述某种不确定性。会混是因为 HMM 的参数表里它们挨得很近,计算时又常常一起出现。
区分方法看它们各自回答什么问题。转移概率回答“状态之间怎么走”,行和列的坐标都是状态;观察值概率回答“处于某个状态时,会看到什么”,一个坐标是状态,另一个坐标是观察值。前者描述的是幕后的移动规律,后者描述的是幕后到台前的映射规律。把两者对调,模型结构就整个错位了,算出来的结果也就没有意义。检查时有个简单办法:看这个概率的两个下标是不是同一类东西,都是状态就是转移概率,一状态一观察就是观察值概率。
4.3 误区三:以为“隐”就是彻底不可知
易混点在于,“隐”这个字听起来像“完全看不见,所以没法算”。会混是因为直觉上总希望信息越全越好,一旦关键变量缺失就觉得问题无解。
区分方法看资料的表述:状态不确定或不可见,但它会通过观测序列的随机过程表现出来。这句话的重点在后半段。状态本身看不见,可它留下的痕迹看得见,这些痕迹带着概率上的偏向,足够用来反推。就像医生看不到病灶内部,但能根据症状组合判断大概是哪一类问题。隐不等于无解,隐只意味着不能直接读,只能间接推。
4.4 误区四:以为有观察序列就一定是 HMM
易混点在于,只要数据是一串一串的,很多人就默认该上 HMM。会混是因为序列数据这个外观太醒目,掩盖了状态可见性这个真正的判断标准。
区分方法回到那张对比表的第一行:先问状态到底看不看得见。如果每个时刻的状态都能直接记录,比如每天的天气本身就被观测到了,那这就是一条马尔可夫链,直接用转移概率矩阵就够了,硬套 HMM 只会平白多出一层不必要的假设。只有当状态藏在幕后、手上只有观察值时,HMM 才有用武之地。这个判断顺序不能颠倒,先看状态可见性,再看数据形态,能省掉大量返工。
5. HMM 的用武之地:为什么语音、图像和基因序列都爱它
资料列了四类应用:语音识别、图像识别、自然语言处理、生物信息学。它们看起来差得很远,却有同一个结构特征:手上有一串能观测到的序列,背后有一串看不见的状态序列,而且状态之间的切换大致只跟当前状态有关。只要一个问题是这个形状,HMM 就有插手的地方。
5.1 语音识别:听得见的声音,听不见的发音状态
一段语音录下来,你得到的是一串按时间排列的声学特征,这是观察值序列。而你真正想知道的,是说话人此刻发的是哪个音、处在哪个发音状态,这些是看不见的。同一个人说同一个音,每次的波形都不会完全一样;不同的人说不同的音,波形也可能撞车。观察值和状态之间不是一一对应,恰好符合 HMM 的设定。
发音状态之间的切换也不是乱跳的:一个音发完通常接某几类音,而不是随便接。这种“下一个状态只跟当前状态有关”的规律,用转移概率就能刻画。于是语音识别就被拆成两件事——用转移概率描述发音状态怎么走,用观察值概率描述某个发音状态会生成什么样的声学特征。两层随机一叠加,正好对上 HMM 的双重结构。
5.2 图像识别与自然语言处理:把答案藏在状态序列里
图像识别里也有类似的结构。一张图切成若干区域之后,每个区域能提取出颜色、纹理、边缘这些可观测的特征,但“这块区域到底是什么类别”往往不是直接给出的,需要根据特征去推断。相邻区域之间还存在上下文关系,前一块区域的判断会影响后一块。把类别当作状态、把特征当作观察值,这套逻辑就接上了 HMM 的框架。
自然语言处理更典型。你看到的是一个词接一个词,这是观察序列;而每个词背后的词性、实体类别、语义角色,是隐藏状态。词和词性之间不是一一对应,同一个词在不同句子里可以是不同词性,同一个词性下面也挂着大量不同的词。词性之间的转移同样有规律,比如限定词后面更可能跟名词而不是动词。序列标注这件事,本质上就是在观察序列已知的条件下,推断最可能的状态序列。
这几个场景的共同点值得强调:它们的难点不在“每个位置单独判断”,而在“整条序列要彼此协调”。单独看一个词、一块区域、一帧音频,信息往往不够;把前后文放在一起,答案才浮出来。HMM 的转移概率提供的正是这种前后协调的约束。
5.3 生物信息学:一段 DNA 里的隐藏注释
生物信息学里的序列动辄成千上万个字符,四种碱基的排列本身是可观测的,但哪些片段是编码区、哪些是调控区,并不能从单个字符上看出来。把“这段序列处在什么功能状态”当作隐藏状态,把碱基当作观察值,就构成了一个标准的 HMM 结构。
这类问题的价值在于,隐藏状态的划分往往比单个字符的取值更有意义。研究人员关心的是整段序列的功能归属,而不是某个位置上的字母是什么。HMM 提供的推断方式,恰好是从可见的字符序列反推不可见的功能区段,这比逐位做规则匹配更贴合实际。
四类应用放在一起看,可以得到一条粗略的筛选标准:如果一个问题能拆成“可见序列 + 不可见状态 + 状态间有转移规律”这三段,HMM 就是一个值得尝试的候选;只要缺一段,就得重新考虑。
6. 什么时候该请 HMM 上场,什么时候趁早换路
判断要不要用 HMM,我习惯按顺序问四个问题,答完基本就有结论了。
第一个问题:我关心的那个东西,是能直接观测到的,还是只能间接推断的?如果它本身就被记录下来了,比如每天的天气、每笔订单的金额,那它就是状态本身,直接用马尔可夫链或者普通分类模型就行,加一层隐藏状态纯属自找麻烦。只有当它是幕后的、需要通过观察值反推的时候,HMM 才有位置。
第二个问题:状态之间的切换,是不是大致只跟当前状态有关?如果明显存在长程依赖,比如当前状态受十几步之前的影响很大,那马尔可夫性这个前提就站不住,硬套会让结果失真。这时候要么把状态设计得更细,把历史信息折进状态里,要么换一类能处理长依赖的方法。
第三个问题:状态数和观察值取值大概是什么规模?状态数一多,转移概率矩阵会按平方增长,观察值概率矩阵会按乘积增长。规模小的时候还好,规模一大,参数数量和所需数据量都会迅速膨胀。如果状态数还没想清楚就先动手建模,后面很容易陷入调不动的困境。
第四个问题:我有没有足够的观察序列来估计这些概率?转移概率和观察值概率都不是凭空写出来的,需要从数据里统计。序列太短、样本太少,估出来的概率会非常不稳,模型看起来能用,实际一跑就偏。
把这四个问题对应到具体场景,大致是这样:
| 场景特征 | 更适合的选择 |
|---|---|
| 状态可直接观测,只关心下一步走向 | 马尔可夫链,用转移概率矩阵 |
| 状态不可观测,但有较长观察序列 | HMM,两层概率一起估 |
| 状态不可观测,且依赖很久以前的历史 | 需要能处理长依赖的序列模型 |
| 状态数极多、样本极少 | 先简化状态设计,别急着上模型 |
| 每个位置独立判断就够,不需要前后协调 | 普通分类方法更轻便 |
这里有一条血泪经验:状态设计是这类模型里最容易翻车的一步,而不是算法本身。状态划得太粗,不同情况被塞进同一个状态,观察值概率会被搅成一锅粥,怎么调都不收敛;状态划得太细,每个状态下的样本少得可怜,概率估出来全是噪声。我见过不止一次,问题不在模型选错,而在状态定义从一开始就没想清楚。
还有一点容易被忽略:HMM 的输出是一串概率推断,不是一个确定的答案。它告诉你“这条状态路径的可能性最大”,而不是“真相必然如此”。把它当成黑匣子直接采信,风险不小;把它当成一个带置信度的参考,反而好用。
从那以后我每次碰到序列问题,都强制先走一遍“状态可见吗、依赖有多长、规模多大、数据够不够”这四步,再决定要不要请 HMM 上场。这四步花不了几分钟,却能省掉后面好几天的返工。这份资料把马尔可夫性、马尔可夫链、转移概率矩阵、HMM 的双重随机过程和摸彩球实例串成了一条完整的线,配合上面这套判断顺序一起看,概念和用法就能对得上号。希望帮到你。
本文还有配套的精品资源,点击获取