2

我有想要拟合 GMMHMM 的一维(单一特征)数据。有两个隐藏状态,我知道每个状态输出的概率分布。也就是说,我知道先验分布,因此知道 GMM 参数。所以我不希望 hmmlearn 对象更新 GMM 的均值协变量、权重

我想通过将paramsinit_params参数设置为仅更新startprobtransmat来完成此操作。

但是 hmmlearn 最终也会更新meancovarsweights。如何阻止它更新这些并让它只更新startprobtransmat

这是我的代码

# Initialize the GMMHMM

means_prior = known_means
covars_prior = known_covars
weights_prior = known_weights

gmm_hmm = hmm.GMMHMM(n_components=n_comps, n_mix=n_mix, weights_prior=weights_prior,
                    means_prior=means_prior, covars_prior=covars_prior,
                     covariance_type='spherical', params='st', init_params='st')
gmm_hmm.means_ = means_prior
gmm_hmm.weights_ = weights_prior
gmm_hmm.covars_ = covars_prior

print('Before fitting...')
print('means')
print(gmm_hmm.means_)
print('weights')
print(gmm_hmm.weights_)
print('covars')
print(gmm_hmm.covars_)

# Fit the GMMHMM to the input sequence
gmm_hmm.fit(input_sequence)

print('After fitting...')
print('means')
print(gmm_hmm.means_)
print('weights')
print(gmm_hmm.weights_)
print('covars')
print(gmm_hmm.covars_)

您可以看到,即使均值保持不变,权重协变量也发生了变化。

Before fitting...
means
[[[51.30211436]
  [53.32515359]]

 [[63.47895865]
  [57.19121711]]]
weights
[[0.58624271 0.41375729]
 [0.48605807 0.51394193]]
covars
[[ 0.6483754   1.2042972 ]
 [13.85258908  1.04639497]]

After fitting...
means
[[[51.16975532]
  [54.19504787]]

 [[65.82853658]
  [54.25868767]]]
weights
[[0.88971249 0.11028751]
 [0.30707459 0.69292541]]
covars
[[ 0.56903044  0.70862057]
 [14.77828965  0.56072741]]

非常感谢您的帮助!

GMMHMM 文档

init_params :控制在训练之前初始化哪些参数。可以包含 's' 表示 startprob,'t' 表示 transmat,'m' 表示均值,'c' 表示协变量,以及 'w' 表示 GMM 混合权重的任意组合。默认为所有参数。

params :控制在训练过程中更新哪些参数。可以包含用于 startprob 的“s”、用于 transmat 的“t”、用于均值的“m”和用于 covars 的“c”以及用于 GMM 混合权重的“w”的任意组合。默认为所有参数。

4

1 回答 1

0

来自文档:https ://hmmlearn.readthedocs.io/en/latest/api.html#hmmlearn.hmm.GaussianHMM 在初始化模型时 尝试使用startprob_priorandtransmat_prior参数。

model = hmm.GaussianHMM(n_components=n_components, startprob_prior=pi_mat, transmat_prior=a_mat)
于 2021-03-21T15:36:52.917 回答