HMM隐马尔可夫模型-通俗易懂

HMM隐马尔可夫模型

在讲HMM(Hidden Markov Model) 之前,应该先搞清楚马尔可夫链,因为 HMM 是根据马尔可夫链建立的一个统计模型,属于马尔可夫链的一种。

不太清楚马尔可夫链的,可以看我这篇文章马尔可夫链(Markov Chain)是什么?通俗易懂 - csdn

生活化例子

直接去看公式的话很难理解 HMM 模型,因为涉及很多专业名词。这里先讲一个 HMM 实例:

还是用最经典的例子,掷骰子。假设我手里有三个不同的骰子。第一个骰子是我们平常见的骰子(称这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1/6。第二个骰子是个四面体(称这个骰子为D4),每个面(1,2,3,4)出现的概率是1/4。第三个骰子有八个面(称这个骰子为D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8。如下图:

假设我们开始掷骰子,我们先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。然后我们掷骰子,得到一个数字,1,2,3,4,5,6,7,8中的一个。不停的重复上述过程,我们会得到一串数字,每个数字都是1,2,3,4,5,6,7,8中的一个。例如我们可能得到这么一串数字(掷骰子10次):

1 6 3 5 2 7 3 5 2 4

这串数字叫做可见状态链。但是在隐马尔可夫模型中,我们不仅仅有这么一串可见状态链,还有一串隐含状态链。在这个例子里,这串隐含状态链就是你用的骰子的序列。比如,隐含状态链有可能是:

D6 D8 D8 D6 D4 D8 D6 D6 D4 D8

一般来说, HMM 中说到的马尔可夫链其实是指隐含状态链,因为隐含状态(骰子)之间存在转换概率(transition probability)。在我们这个例子里,D6的下一个状态是D4,D6,D8的概率都是1/3。D4,D8的下一个状态是D4,D6,D8的转换概率也都一样是1/3。这样设定是为了最开始容易说清楚,但是我们其实是可以随意设定转换概率的。比如,我们可以这样定义,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。这样就是一个新的HMM。

同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。我们同样可以对输出概率进行其他定义。比如,我有一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。

其实对于 HMM 来说,如果提前知道所有隐含状态之间的转换概率和所有隐含状态到所有可见状态之间的输出概率,做模拟是相当容易的。但是应用 HMM 模型时候呢,往往是缺失了一部分信息的,有时候你知道骰子有几种,每种骰子是什么,但是不知道掷出来的骰子序列;有时候你只是看到了很多次掷骰子的结果,剩下的什么都不知道。这就涉及到了 HMM 的三个基本问题,以后用到了再说。

数学定义

数学定义看着头大,但是学习一个模型的时候,如果不去看数学定义,不去理解数学定义的话,我们很容易学的云里雾里的,好像自己懂了,又没完全懂,然后过阵子就忘了。我们结合上面的例子去对应数学定义中的符号,更容易理解。

HMM 由初始概率分布、状态转移概率分布以及观测概率分布确定。

  • 骰子例子中,初始概率分布就是第一次选骰子的概率分布,比如第一次投掷时,我们有三个骰子,每一个骰子被选的概率都是1/3,就是初始概率分布。

  • 状态转移概率分布就是每个骰子之间的转移概率分布,比如这一次我们用了 D4 骰子,下一次是 D4、D6 还是 D8 的概率,就叫做转移概率。就像下面的图一样,我们每条有向线都有一个概率,组合起来就是状态转移概率分布。
    在这里插入图片描述

  • 观测概率分布就是上面例子所说的输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。同样可以对输出概率进行其他定义。比如,我有一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。

HMM 的形式定义如下:
首先我们假设 𝑄 𝑄 Q是所有可能的状态的集合, 𝑉 𝑉 V是所有可能的观测的集合,即:
Q = { q 1 , q 2 , … , q N } , V = { v 1 , v 2 , … v M } Q=\left\{q_{1}, q_{2}, \ldots, q_{N}\right\}, V=\left\{v_{1}, v_{2}, \ldots v_{M}\right\} Q={ q1,q2,,qN},V={ v1,v2,vM}
其中, 𝑁 𝑁 N是可能的状态数, 𝑀 𝑀 M是可能的观测数。

骰子例子中,Q的集合就是{D4,D6,D8},V的集合就是{1,2,3,4,5,6,7,8}

I I I是长度为 T T T的状态序列,O是对应的观测序列:
I = { i 1 , i 2 , … , i T } , O = { o 1 , o 2 , … o T } I=\left\{i_{1}, i_{2}, \ldots, i_{T}\right\}, O=\left\{o_{1}, o_{2}, \ldots o_{T}\right\} I={ i

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
嗯,隐马尔可夫模型(Hidden Markov Model)是一种常用的序列建模方法,可以用于股票价格的预测。下面我将提供一个基于Python的完整源码和数据的例子,来解释如何使用隐马尔可夫模型进行股票价格预测。 首先,我们需要准备一些数据。假设我们手头有股票A的每日收盘价数据,这些数据可以保存在一个以日期为索引的Pandas DataFrame中。 以下是数据的示例,其中Date表示日期,Close表示当天的收盘价: ```py import pandas as pd data = {'Date': ['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'], 'Close': [100, 110, 115, 105, 95]} df = pd.DataFrame(data) df['Date'] = pd.to_datetime(df['Date']) df.set_index('Date', inplace=True) ``` 接下来,我们需要使用Python的hmmlearn库来构建隐马尔可夫模型并进行预测。如果尚未安装该库,可以使用以下命令进行安装: ```py pip install hmmlearn ``` 以下是使用隐马尔可夫模型进行股票价格预测的代码示例: ```py from hmmlearn import hmm # 创建隐马尔可夫模型对象 model = hmm.GaussianHMM(n_components=2, covariance_type="diag") # 拟合模型 model.fit(df[['Close']]) # 预测概率和状态序列 prob, states = model.decode(df[['Close']]) # 输出预测结果 df['State'] = states print(df) ``` 上述代码中,我们首先创建一个GaussianHMM对象,该对象的`n_components`参数指定了两个隐藏状态(我们假设股票价格会呈现上涨和下跌两种状态),`covariance_type`参数指定了协方差矩阵的类型。 然后,我们使用拟合方法(fit)来训练模型,输入的是收盘价数据。 接着,我们使用decode方法来计算每个观测值对应的隐藏状态,并将其保存在DataFrame中的State列中。 最后,打印输出整个DataFrame,即可查看预测结果。 使用隐马尔可夫模型进行股票价格预测是一个相对简化的方法,实际情况可能更加复杂。然而,这个例子可以帮助你了解如何使用隐马尔可夫模型进行股票价格预测,并且提供一个基于Python的完整源码和数据的参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小浩弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值