当我们有新样本时如何更新 hmmlearn 学习对象?
How to update the hmmlearn learned object when we have new samples?
我已经通过 hmmlearn 为隐马尔可夫模型实现了一个简单的代码,并且运行良好。我使用 fit() 方法,即 hmmlearn.fit 来根据我的数据学习 hmm 参数。如果我有更多数据并想从头开始更新以前安装的没有 training/fitting 的模型,我该怎么办?
换句话说,我如何根据我目前所知道的来初始化一个新模型,并继续使用新的 observations/samples 来为我的数据拟合更好的模型
在 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, 1.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
),您可以使用相同的更新模型来训练新的发射序列。可以选择pickling保存整个模型(如上图),也可以保存transition matrix,emission matrix等的numpy数组
我已经通过 hmmlearn 为隐马尔可夫模型实现了一个简单的代码,并且运行良好。我使用 fit() 方法,即 hmmlearn.fit 来根据我的数据学习 hmm 参数。如果我有更多数据并想从头开始更新以前安装的没有 training/fitting 的模型,我该怎么办? 换句话说,我如何根据我目前所知道的来初始化一个新模型,并继续使用新的 observations/samples 来为我的数据拟合更好的模型
在 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, 1.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
),您可以使用相同的更新模型来训练新的发射序列。可以选择pickling保存整个模型(如上图),也可以保存transition matrix,emission matrix等的numpy数组