机器学习入门:隐马尔科夫模型-8
機器學習入門:隱馬爾科夫模型
1、實驗描述
-
本實驗先簡單介紹隱馬爾科夫模型,然后提供一份股票交易的數據,通過建立隱馬爾科夫模型對股票數據進行分析,并將最終結果用圖的方式展示出來。
-
實驗時長:45分鐘
-
主要步驟:
-
讀取數據文件
-
數據預處理
-
模型創建
-
模型的預測
-
模型評估
-
繪制相關的指標
-
2、實驗環境
- 虛擬機數量:1
- 系統版本:CentOS 7.5
- scikit-learn版本: 0.19.2
- numpy版本:1.15.1
- matplotlib版本:2.2.3
- python版本:3.5
- IPython版本:6.5.0
- hmmlearn版本:0.2.0
3、相關技能
-
Python編程
-
Scikit-learn編程
-
Matplotlib編程
-
Numpy編程
-
隱馬爾科夫模型
4、相關知識點
- 隱馬爾科夫模型
- 模型建立
- 模型預測
- 模型評估
- 狀態序列
- 觀測序列
5、實現效果
- 使用隱馬爾科夫模型對股票維度分析結果如下圖所示:
6、實驗步驟
6.1隱馬爾科夫模型:HMM(Hidden Markov Model)是關于時序的概率模型,描述由一個隱藏的馬爾科夫鏈生成不可觀測的狀態隨機序列,再由各個狀態生成觀測隨機序列的過程。隱馬爾科夫模型隨機生成的狀態隨機序列,稱為狀態序列;每個狀態生成一個觀測,由此產生的觀測隨機序列,稱為觀測序列。序列的每個位置可以看做是一個時刻。
6.1.1隱馬爾科夫模型三個基本問題:
6.1.1.1概率計算問題: 給定模型和觀測序列 ,計算模型λ下觀測序列O出現的概率P(O| λ)
6.1.1.2學習問題: 已知觀測序列,估計模型的參數,使得在該模型下觀測序列P(O| λ)最大
6.1.1.3預測問題:解碼問題:已知模型和觀測序列,求給定觀測序列條件概率P(I|O,λ)最大的狀態序列I
6.2.進入Anaconda創建的虛擬環境“ML” ,并準備相應的數據文件。
6.2.1.從zkpk的公共目錄下拷貝實驗所需的數據文件到zkpk的家目錄下
[zkpk@master ~]$ cd [zkpk@master ~]$ cp /home/zkpk/experiment/SH600000.txt /home/zkpk6.2.1.1數據集SH600000.txt介紹:
6.2.1.2數據共1511行7列,每一行為一個股票交易相關的指標
6.2.1.3每列分別代表:日期、開盤、最高價、最低價、收盤、成交量、成交額
圖 26.2.2在zkpk的家目錄下執行如下命令
[zkpk@master ~]$ cd [zkpk@master ~]$ source activate ML (ML) [zkpk@ master ML]$6.2.3此時已經進入虛擬環境。鍵入如下命令,進入ipython交互是編程環境
(ML) [zkpk@ master ML]$ ipython Python 3.5.4 |Anaconda, Inc.| (default, Nov 3 2017, 20:01:27) Type 'copyright', 'credits' or 'license' for more information IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help. In [1]:6.3在Ipython交互式編程環境中開始進行實驗
6.3.1導入實驗所需的包
In [1]: import numpy as np...: from hmmlearn import hmm...: import matplotlib.pyplot as plt...: import matplotlib as mpl...: from sklearn.metrics.pairwise import pairwise_distances_argmin...: import warnings6.3.2讀取數據文件
6.3.2.1使用“\t”分割符切詞, 跳過前兩行,抽取指定的列
In [2]: x = np.loadtxt('SH600000.txt', delimiter='\t', skiprows=2, usecols=(4, 5, 6, 2, 3)) # 列(4, 5, 6, 2, 3)分別對應數據集中的收盤價、成交量、成交額、最高、最低的數據6.3.3數據預處理
6.3.3.1讀取對應的字段
In [6]: close_price = x[:, 0] #收盤價...: volumn = x[:, 1] #交易量...: amount = x[:, 2] #交易額6.3.3.2計算振幅:每天的最高價與最低價的差
In [7]: amplitude_price = x[:, 3] - x[:, 4] # 振幅:每天的最高價與最低價的差 In [8]: diff_price = np.diff(close_price) # 漲跌值:收盤后價格做一個一階差分;即今日收盤價減去昨日收盤價6.3.3.3所有元素跳過第一個元素
In [10]:volumn = volumn[1:] # 成交量...: amount = amount[1:] # 成交額...: amplitude_price = amplitude_price[1:] # 每日振幅6.3.3.4將多個特征疊加起來,形成樣本。
In[11]: sample = np.column_stack((diff_price, volumn, amount, amplitude_price)) # 觀測值;column_stack利用1-D數組組成的序列,生成一個2-D數組,其中每個1-D數組依次作為結果2維數組中的列6.3.4建立模型:訓練數據只有觀測序列,則HMM的學習需要使用EM算法,是非監督學習
In [12]: n = 5 #給定五個類別(狀態)...: model = hmm.GaussianHMM(n_components=n, covariance_type='full') # 建立模型 #指定每個類別的系數:方差各不相同。6.3.5利用樣本進行模型訓練
In [13]:model.fit(sample) # 訓練模型 圖 36.3.6模型預測:
6.3.6.1輸出每個類別的相應概率值
6.3.6.2設置浮點輸出,以及每個維度的輸出個數
In [15]: y = model.predict_proba(sample) # 輸出類別的概率值...: np.set_printoptions(suppress=True, edgeitems=100)...: print('proba:\n', y) 圖 46.3.7繪制跌漲值,交易量,所有組分,組分概率的圖示
In [16]: t=np.arange(len(diff_price))#跌漲值的length作為時間維度的長度...: plt.figure(figsize=(10,6.7), facecolor='w') #設置圖示中畫布的整體大小及背影色...: plt.subplot(421) # 子圖的布局,4行兩列...: plt.plot(t, diff_price, 'r-')...: plt.grid(True)...: plt.title('amplitude_price') #每日振幅...: plt.subplot(422)...: plt.plot(t, volumn, 'g-') # 交易量...: plt.grid(True)...: plt.title('volumn')...: clrs = plt.cm.terrain(np.linspace(0, 0.8, n)) # linspace方法在指定范圍內返回均勻間隔的數字;...: plt.subplot(423)...: for i, clr in enumerate(clrs):...: plt.plot(t, y[:, i], '-', lw=0.3, color=clr, alpha=0.7)...: plt.title('All components') # 所有組分...: plt.grid(True)...: for i, clr in enumerate(clrs):...: axes = plt.subplot(4,2,i+4)...: plt.plot(t, y[:,i], '-', color=clr)...: print('Component probability ', y[:,i]) #組分概率...: plt.grid(True)...: plt.title("Compoent %d" %(i+1)) In [18]: plt.suptitle('SH600000 stock GaussianHMM Demarcation Hidden Variable') In [20]: plt.tight_layout() In [21]: plt.subplots_adjust(top=0.8) In [22]: plt.show() 圖 5 圖 67、參考答案
- 代碼清單Hmm_test.py
8、總結
本次實驗使用隱馬爾科夫模型,對股票數據進行分析,大體流程是數據預處理、建模、訓練模型、預測及最終結果可視化。涉及的理論及編碼知識量較大,需要大家多多理解相關的理論知識,在此基礎上進行相應的編程實現。在編程的過程中,要學會查閱文檔的方式解決疑問,如類、方法如何使用、作用是什么、某參數的意思是什么等等問題。
總結
以上是生活随笔為你收集整理的机器学习入门:隐马尔科夫模型-8的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 幻读Java_脏读、幻读、不可重复读和丢
- 下一篇: java删除list元素的几种方式