HMM算例 python 有代码
原理
原理文字來源于 https://www.cnblogs.com/lcj1105/p/4936103.html隱馬爾可夫(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模型時候呢,往往是缺失了一部分信息的,有時候你知道骰子有幾種,每種骰子是什么,但是不知道擲出來的骰子序列;有時候你只是看到了很多次擲骰子的結果,剩下的什么都不知道。如果應用算法去估計這些缺失的信息,就成了一個很重要的問題。這些算法我會在下面詳細講。
算例實現
代碼是自己的啦
拿股票數據進行演示
讀取數據
#!/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())
輸入因素有 日期,最高價,最低價,開盤價,收盤價,成交量,資金凈額
刪除我們不想要的因素
Stocks.reset_index(inplace=True,drop=False) Stocks.drop(['Open','High','Low','Adj Close'],axis=1,inplace=True) #剩下Date Close收盤價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,時間,收盤價,成交量
X輸入為收盤價差值, 收盤價 ,成交量
建模
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 是每次輸出結果一樣,
對新的數據進行預測,可以采用hidden_states = model.predict(X),或者hidden_states = model.predict(X)
#其中 model.predict(X) 返回只有標簽,而 model.decode(X, algorithm=“viterbi”),返回有:所生成狀態序列的對數概率logprob,和依據algorithm加密器獲得的X中每個樣本的標簽hidden_states
結果可視化
對成交量進行結果可視化
HMM模型只是能分離出不同的狀態,具體每個狀態對應現實的市場意義,需要人為觀察。
GaussianHMM是針對連續性輸入有作用的。
離散值的用MultinomialHMM
#本文的算例是非監督學習,后續有時間研究監督學習的hmm。
在HMM中,如果已知觀察序列和產生觀察序列的狀態序列,那么可用以下哪種方法直接進行參數估計()
A.EM算法
B.維特比算法
C.前向后向算法
D.極大似然估計
EM算法: 只有觀測序列,無狀態序列時來學習模型參數,即Baum-Welch算法
維特比算法: 用動態規劃解決HMM的預測問題,不是參數估計
前向后向:用來算概率
極大似然估計:即觀測序列和相應的狀態序列都存在時的監督學習算法,用來估計參數
總結
以上是生活随笔為你收集整理的HMM算例 python 有代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 偿债能力分析需要哪些数据
- 下一篇: 622823是哪个银行的卡