有新样本时,如何更新hmmlearn学习对象?

问题描述

我已经通过hmmlearn为隐藏的马尔可夫模型实现了一个简单的代码,并且运行良好。我使用了fit()方法,即hmmlearn.fit,根据我的数据学习hmm参数。如果我有更多数据,并且想更新以前拟合的模型而无需从头进行训练/拟合,该怎么办? 换句话说,我如何才能根据目前的知识来初始化新模型,并继续使用新的观测值/样本,以使更好的模型适合我的数据

解决方法

hmmlearn中,您可能已经注意到,一旦使用hmmlearn.fit进行训练,模型参数就会更新:

import numpy as np
import pickle
from hmmlearn import hmm

np.random.seed(42)

# initialize model
model = hmm.GaussianHMM(n_components=3,covariance_type="full")
model.startprob_ = np.array([0.33,0.33,0.34])
model.transmat_ = np.array([[0.1,0.2,0.7],[0.3,0.5,0.2],[0.5,0.1,0.4]])
model.means_ = np.array([[1.0,1.0],[2.0,[3.0,1.0]])
model.covars_ = np.tile(np.identity(2),(3,1,1))

# generate "fake" training data
emissions1,states1 = model.sample(100)
print("Transition matrix before training: \n",model.transmat_)

# train
model.fit(emissions1)
print("Transition matrix after training: \n",model.transmat_)

# save model
with open("modelname.pkl","wb") as f: pickle.dump(model,f)

#################################

>>> Transition matrix before training: 
 [[0.1 0.2 0.7]
 [0.3 0.5 0.2]
 [0.5 0.1 0.4]]
>>> Transition matrix after training: 
 [[0.19065325 0.50905216 0.30029459]
 [0.41888047 0.39276483 0.18835471]
 [0.44558543 0.13767827 0.4167363 ]]

这意味着,如果您有新的训练数据(即emissions2),则可以使用相同的更新模型来训练新的发射序列。您可以选择通过酸洗来保存整个模型(如上所示),也可以保存过渡矩阵,发射矩阵等的numpy数组。