日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

HMM算例 python 有代码

發(fā)布時(shí)間:2024/9/30 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HMM算例 python 有代码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原理

原理文字來源于 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à),成交量

dates = np.array([q[0] for q in Stocks], dtype=int) end_val = np.array([q[1] for q in Stocks])#(2079,)#收盤價(jià) volume = np.array([q[2] for q in Stocks])[1:]#(2078,)#成交量diff = np.diff(end_val)#前后收盤價(jià) 價(jià)格差值 dates = dates[1:] end_val = end_val[1:]X = np.column_stack([diff, end_val,volume])#收盤價(jià)差值,收盤價(jià) ,成交量 print(X)


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é)果可視化

hidden_states=pd.DataFrame(hidden_states)#輸出狀態(tài) end_val=pd.DataFrame(end_val)#收盤價(jià) volume=pd.DataFrame(volume)#成交量 c=pd.concat([hidden_states,volume],axis=1)for i in range(len(c)):if c.iloc[i,0]==0:plt.scatter(i,c.iloc[i,1], c='b')elif c.iloc[i,0]==1:plt.scatter(i,c.iloc[i,1], c='r')elif c.iloc[i, 0] == 2:plt.scatter(i,c.iloc[i, 1], c='c')else:plt.scatter(i,c.iloc[i,1]) plt.show()


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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。