python3機器學習經典實例-第八章解剖時間序列和時序數據33
針對序列數據創建隱馬爾科夫模型
隱馬爾科夫模型(HMMs)是處理序列數據非常強大的方法,廣泛應用於金融、語音分析、天氣預測、單詞序列等領域。我們往往對發現隨時間變化的隱藏模式非常感興趣。任何產生輸出序列的數據源均可以產生模式。請注意,HMMs是一個生成模型,這也就意味著一旦掌握了其底層結構,就可以產生數據。HMMs並不能對基礎形式的類進行區分,這與那些可以做類區分的判定模型形成鮮明的對比,但是這些可以做類區分的判定模型卻不能生成數據。
準備工作
例如,我們希望預測明天的天氣是晴天、陰天或下雨。為了實現預測,需要查看所有的參數,例如溫度、氣壓等,而潛在的狀態是隱藏的。這裡,潛在的狀態是指3個可選狀態:晴天、陰天或下雨。如果希望了解更多HMMs的詳細介紹,可以在https://www.robots.ox.ac.uk/~vgg/rg/slides/hmm.pdf找到相關信息。本例將用到hmmlearn來創建和訓練HMMs,在進行接下來的學習之前,請確保你已經安裝了hmmlearn,安裝說明請查看http://hmmlearn.readthedocs.org/en/latest。
- 創建hmm.py文件,並載入必要的資料庫。
import numpy as npimport matplotlib.pyplot as pltfrom hmmlearn.hmm import GaussianHMMfrom convert_to_timeseries import convert_data_to_timeseries
- 本例將用到提供的data_hmm.txt文件。該文件包括帶逗號分隔符的行。每行包括3個值:一個年份、一個月份和一個浮點型數據。下面將它載入到一個NumPy數組中:
# Load data from input fileinput_file = data_hmm.txtdata = np.loadtxt(input_file, delimiter=,)
- 將數據按照列的方向堆疊起來用於分析。我們並不需要在技術上做列堆疊,因為只有一個列,但如果你有多於一個列要進行分析,那麼可以用下面的代碼實現:用4個成分創建並訓練HMM。成分的個數是一個需要進行選擇的超參數。這裡選擇4個成分,也就意味著用4個潛在狀態生成數據。接下來看看這個參數的性能如何變化:
# Arrange data for training X = np.column_stack([data[:,2]])# Create and train Gaussian HMM print ("
Training HMM....")num_components = 4model = GaussianHMM(n_components=num_components, covariance_type="diag", n_iter=1000)model.fit(X)
- 運行預測器以獲得隱藏狀態:計算這些隱藏狀態的均值和方差:
# Predict the hidden states of HMM hidden_states = model.predict(X)print ("
Means and variances of hidden states:")for i in range(model.n_components): print ("
Hidden state", i+1) print ("Mean =", round(model.means_[i][0], 3)) print ("Variance =", round(np.diag(model.covars_[i])[0], 3))
- 正如前面所述,HMM是一個生成模型,因此這裡生成1000個示例數據並將其畫出:
# Generate data using modelnum_samples = 1000samples, _ = model.sample(num_samples) plt.plot(np.arange(num_samples), samples[:,0])plt.title(Number of components = + str(num_components))plt.show()
當修改num_components 參數:
num_components = 8
當修改num_components 參數:
num_components = 12
後面兩個實例:暫不修改
《針對序列文本數據創建條件隨機場》由於資料庫的原因,暫不修改
《用隱馬爾科夫模型分析股票市場數據》由於雅虎財經(quotes_historical_yahoo_ochl)暫停服務,暫不修改
推薦閱讀:
※python兩則經驗雜談(package相對路徑,中文文件夾路徑讀寫)
※轉載好文章「量產型炮灰工程師」
※Python沒有常量是不是不夠安全的設計?
※這或許是對小白最友好的python入門了吧——13,字典初識
※從零開始的python世界的闖蕩之視頻學習篇 第五話 字元串,列表,元組,字典