人工智能:python 实现 第十一章,使用隐马尔科夫模型生成数据

使用隐马尔科夫模型生成数据

     隐马尔科夫模型是一个强大的分析时间序列数据的分析工具。 假定被建模的系统是带有隐藏状态的马尔可夫过程,这意味着底层系统可以是一组可能的状态之一,系统经历一系列的状态转换,从而产生一系列输出。我们仅能观察输出,而无法观测状态,因为这些状态被隐藏了。我们的目标是对这些数据建模,以便我们能推断未知数据的状态转换。

    为了理解HMMs,让我们是靠一下例子,一个销售人员因为其工作,需要转辗在三个城市之间(伦敦,巴塞罗纳,纽约)。他的目的是最小化旅行的时间,以便更高效的工作。考虑一下他的工作委托和计划安排,我们能得到他从x城市到y城市的概率。在一下给出的信息中,P(X->Y)表示从X城市到Y城市的概率:

P(伦敦->伦敦) =0.10

P(伦敦->巴塞罗那) = 0.70 

P(伦敦->纽约) = 0.20

P(巴塞罗那->巴塞罗那) =0.15

P(巴塞罗那->伦敦) = 0.75

P(巴塞罗那->纽约) = 0.10

P(纽约->纽约)=0.05

P(纽约->伦敦)= 0.60

P(纽约->巴塞罗那) = 0.35

将上面数据转化为矩阵:

                伦敦    巴塞罗那    纽约

     伦敦     0.10     0.70        0.20

巴塞罗那    0.75    0.15        0.10

      纽约     0.60    0.35        0.05

我们现在得到了所有的信息,让我们继续问题陈述.这个销售人员在周二这天从伦敦出发开始了他的旅行,,并且它需要在周五计划一些事情,但是这依靠他胜出何地。他将出现在巴塞罗那的概率是多少呢?这个表格将帮我们弄清楚:

  如果我们没有一个 马尔可夫链来对这个问题建模,我们将不会知道他的日程安排是怎样的。我们的目标是给出他在被给定日期他在特定城市的可能性。假设我们将转换矩阵设为T,当前日期为X(i),则

X(i+1)=X(i)*T

在这个案例中,周五离周二是3天。这意味着我们必须计算X(i+3)

X(i+1)=X(i)*T

X(i+2)=X(i+1)*T

X(i+3)=X(i+2)*T

可推出:X(i+3)=X(i)*T^3

我们需要设置X(i) 

X(i)=[0.10 0.70 0.20]

下一步就是计算矩阵的立方。网上有很多在线对矩阵进行操作的工具例如 http://matrix.reshish.com/multiplication.php。计算结果如下:

T^3 =人工智能:python 实现 第十一章,使用隐马尔科夫模型生成数据_第1张图片

则在周二的概率是

P(伦敦)= 0.31

P(巴塞罗那)=0.53

P(NY)=0.16

我们能够考到巴塞罗那的概率最高,这也具有地理意义,因为巴塞罗那相比于纽约,离伦敦是更近的。那如何构建一个HMMS?

创建一个python文档,代码如下:

import datetime
import numpy as np
import matplotlib.pyplot as plt
from hmmlearn.hmm import GaussianHMM
from Slicing_time_series_data import read_data
#   hmmlearn实现了三种HMM模型类,按照观测状态是连续状态还是离散状态,可以分为两类。GaussianHMM和GMMHMM是连续观测状态的HMM模型,而MultinomialHMM是离散观测状态的模型,也是我们在HMM原理系列篇里面使用的模型。
#加载数据
data = np.loadtxt('data_1D.txt',delimiter=',')


#提取第三列进行训练
x=np.column_stack([data[:,2]])


#创建GaussianHMM,参数:状态的数量n_components=5,covariance_type='diag',“diag” - 每个状态使用对角协方差矩阵。n_iter要执行的最大迭代次数。
num_components =5
hmm =GaussianHMM(n_components=num_components,covariance_type='diag',n_iter=1000)


#训练HMM
print("\n正在训练隐马尔科夫模型....")
hmm.fit(x)
#输出每个HMM状态的平均值和方差
print("\n均值和方差:")
for i in range(hmm.n_components):
    print('\n隐状态',i+1)
    print('均值 = ',round(hmm.means_[i][0],2))
    print("方差 = ",round(np.diag(hmm.covars_[i])[0],2))


#生成1200条数据训练HMM模型并绘出
num_samples = 1200
generated_data,_=hmm.sample(num_samples)#_约定不关心数字的变量,后期不使用
plt.plot(np.arange(num_samples),generated_data[:,0],c='red')
plt.title('Gnenerate data')
plt.show()

1200数据如下

人工智能:python 实现 第十一章,使用隐马尔科夫模型生成数据_第2张图片

输出结果如下:结果与书上不同,本人环境使用的是hmmlearn0.20版本,较之前训练数据不同了

人工智能:python 实现 第十一章,使用隐马尔科夫模型生成数据_第3张图片


你可能感兴趣的:(人工智能:python 实现 第十一章,使用隐马尔科夫模型生成数据)