HMM算例 python 有代码
原理
原理文字來源于 https://www.cnblogs.com/lcj1105/p/4936103.html隱馬爾可夫(HMM)。
還是用最經(jīng)典的例子,擲骰子。假設(shè)我手里有三個(gè)不同的骰子。第一個(gè)骰子是我們平常見的骰子(稱這個(gè)骰子為D6),6個(gè)面,每個(gè)面(1,2,3,4,5,6)出現(xiàn)的概率是1/6。第二個(gè)骰子是個(gè)四面體(稱這個(gè)骰子為D4),每個(gè)面(1,2,3,4)出現(xiàn)的概率是1/4。第三個(gè)骰子有八個(gè)面(稱這個(gè)骰子為D8),每個(gè)面(1,2,3,4,5,6,7,8)出現(xiàn)的概率是1/8。
假設(shè)我們開始擲骰子,我們先從三個(gè)骰子里挑一個(gè),挑到每一個(gè)骰子的概率都是1/3。然后我們擲骰子,得到一個(gè)數(shù)字,1,2,3,4,5,6,7,8中的一個(gè)。不停的重復(fù)上述過程,我們會(huì)得到一串?dāng)?shù)字,每個(gè)數(shù)字都是1,2,3,4,5,6,7,8中的一個(gè)。例如我們可能得到這么一串?dāng)?shù)字(擲骰子10次):1 6 3 5 2 7 3 5 2 4
這串?dāng)?shù)字叫做可見狀態(tài)鏈。但是在隱馬爾可夫模型中,我們不僅僅有這么一串可見狀態(tài)鏈,還有一串隱含狀態(tài)鏈。在這個(gè)例子里,這串隱含狀態(tài)鏈就是你用的骰子的序列。比如,隱含狀態(tài)鏈有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8
一般來說,HMM中說到的馬爾可夫鏈其實(shí)是指隱含狀態(tài)鏈,因?yàn)殡[含狀態(tài)(骰子)之間存在轉(zhuǎn)換概率(transition probability)。在我們這個(gè)例子里,D6的下一個(gè)狀態(tài)是D4,D6,D8的概率都是1/3。D4,D8的下一個(gè)狀態(tài)是D4,D6,D8的轉(zhuǎn)換概率也都一樣是1/3。這樣設(shè)定是為了最開始容易說清楚,但是我們其實(shí)是可以隨意設(shè)定轉(zhuǎn)換概率的。比如,我們可以這樣定義,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。這樣就是一個(gè)新的HMM。
同樣的,盡管可見狀態(tài)之間沒有轉(zhuǎn)換概率,但是隱含狀態(tài)和可見狀態(tài)之間有一個(gè)概率叫做輸出概率(emission probability)。就我們的例子來說,六面骰(D6)產(chǎn)生1的輸出概率是1/6。產(chǎn)生2,3,4,5,6的概率也都是1/6。我們同樣可以對(duì)輸出概率進(jìn)行其他定義。比如,我有一個(gè)被賭場動(dòng)過手腳的六面骰子,擲出來是1的概率更大,是1/2,擲出來是2,3,4,5,6的概率是1/10。
其實(shí)對(duì)于HMM來說,如果提前知道所有隱含狀態(tài)之間的轉(zhuǎn)換概率和所有隱含狀態(tài)到所有可見狀態(tài)之間的輸出概率,做模擬是相當(dāng)容易的。但是應(yīng)用HMM模型時(shí)候呢,往往是缺失了一部分信息的,有時(shí)候你知道骰子有幾種,每種骰子是什么,但是不知道擲出來的骰子序列;有時(shí)候你只是看到了很多次擲骰子的結(jié)果,剩下的什么都不知道。如果應(yīng)用算法去估計(jì)這些缺失的信息,就成了一個(gè)很重要的問題。這些算法我會(huì)在下面詳細(xì)講。
算例實(shí)現(xiàn)
代碼是自己的啦
拿股票數(shù)據(jù)進(jìn)行演示
讀取數(shù)據(jù)
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Author: yudengwu # @Date : 2020/5/31import datetime import numpy as np import pandas as pdfrom hmmlearn.hmm import GaussianHMMimport matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') Stocks=pd.read_csv('data/TSLA_data.csv') print(Stocks.head())
輸入因素有 日期,最高價(jià),最低價(jià),開盤價(jià),收盤價(jià),成交量,資金凈額
刪除我們不想要的因素
Stocks.reset_index(inplace=True,drop=False) Stocks.drop(['Open','High','Low','Adj Close'],axis=1,inplace=True) #剩下Date Close收盤價(jià)23.889999 Volume成交量8218800 Stocks['Date'] =pd.to_datetime(Stocks['Date']) Stocks['Date'] = Stocks['Date'].apply(datetime.datetime.toordinal) Stocks = list(Stocks.itertuples(index=False, name=None)) print(Stocks)
得到 序列ID,時(shí)間,收盤價(jià),成交量
X輸入為收盤價(jià)差值, 收盤價(jià) ,成交量
建模
model = GaussianHMM(n_components=4, covariance_type="full", n_iter=1000,random_state=1) model.fit(X)logprob, hidden_states = model.decode(X, algorithm="viterbi")#random_state 是每次輸出結(jié)果一樣,
對(duì)新的數(shù)據(jù)進(jìn)行預(yù)測,可以采用hidden_states = model.predict(X),或者h(yuǎn)idden_states = model.predict(X)
#其中 model.predict(X) 返回只有標(biāo)簽,而 model.decode(X, algorithm=“viterbi”),返回有:所生成狀態(tài)序列的對(duì)數(shù)概率logprob,和依據(jù)algorithm加密器獲得的X中每個(gè)樣本的標(biāo)簽hidden_states
結(jié)果可視化
對(duì)成交量進(jìn)行結(jié)果可視化
HMM模型只是能分離出不同的狀態(tài),具體每個(gè)狀態(tài)對(duì)應(yīng)現(xiàn)實(shí)的市場意義,需要人為觀察。
GaussianHMM是針對(duì)連續(xù)性輸入有作用的。
離散值的用MultinomialHMM
#本文的算例是非監(jiān)督學(xué)習(xí),后續(xù)有時(shí)間研究監(jiān)督學(xué)習(xí)的hmm。
在HMM中,如果已知觀察序列和產(chǎn)生觀察序列的狀態(tài)序列,那么可用以下哪種方法直接進(jìn)行參數(shù)估計(jì)()
A.EM算法
B.維特比算法
C.前向后向算法
D.極大似然估計(jì)
EM算法: 只有觀測序列,無狀態(tài)序列時(shí)來學(xué)習(xí)模型參數(shù),即Baum-Welch算法
維特比算法: 用動(dòng)態(tài)規(guī)劃解決HMM的預(yù)測問題,不是參數(shù)估計(jì)
前向后向:用來算概率
極大似然估計(jì):即觀測序列和相應(yīng)的狀態(tài)序列都存在時(shí)的監(jiān)督學(xué)習(xí)算法,用來估計(jì)參數(shù)
總結(jié)
以上是生活随笔為你收集整理的HMM算例 python 有代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 偿债能力分析需要哪些数据
- 下一篇: python打包成exe 可执行文件 。