多元隐马尔可夫模型实现问题

Posted

技术标签:

【中文标题】多元隐马尔可夫模型实现问题【英文标题】:Multivariate Hidden Markov Model implementation question 【发布时间】:2019-03-06 23:14:35 【问题描述】:

我必须对来自眼动仪的信号进行分类。我有一个向量表示给定时间的眼睛速度。这个想法是,当速度低时,它很可能是注视,而当速度高时,它是扫视。每个点都依赖于上一个以来。这导致使用多元隐马尔可夫模型 (HMM) 来分类是否是扫视。该模型是两个状态系统,如this。我总共要学习 8 个参数,每个高斯的均值和方差,以及每个状态的两个转换概率。为了估计参数,我将 MATLAB 与工具箱 PMTK3 一起使用。我还没有找到其他允许使用高斯 HMM 的 MATLAB 工具箱。我的代码如下所示:

exampleData = [25.2015   24.1496   33.0422   21.9321   15.5897    9.1592   19.9374   15.2868    9.6767   39.8610   22.2483   31.6508]
prior.mu = [10 10];
prior.Sigma = [0.5; 0.5];
prior.k = 2;
prior.dof = prior.k + 1;
model = hmmFit(data, 2, 'gauss', 'verbose', true, 'piPrior', [3 2], ...
    'emissionPrior', prior, 'nRandomRestarts', 2, 'maxIter', 10);

据我了解,prior.k 是它应该找到多少个簇,应该是两个簇:扫视和注视。当我运行它时它会输出此错误消息:

Error using chol
Matrix must be positive definite.
Error in gaussSample (line 20)
A = chol(Sigma, 'lower');
Error in kmeansFit (line 42)
    noise = gaussSample(zeros(1, length(v)), 0.01*diag(v), K);
Error in kmeansInitMixGauss (line 7)
[mu, assign] = kmeansFit(data, K);
Error in mixGaussFit>initGauss (line 38)
        [mu, Sigma, model.mixWeight] = kmeansInitMixGauss(X, nmix);
Error in mixGaussFit>@(m,X,r)initGauss(m,X,r,initParams,prior) (line 24)
initFn = @(m, X, r)initGauss(m, X, r, initParams, prior);
Error in emAlgo (line 56)
model = init(model, data, restartNum);
Error in mixGaussFit (line 25)
[model, loglikHist] = emAlgo(model, data, initFn, @estep, @mstep , ...
Error in hmmFitEm>initWithMixModel (line 244)
    mixModel    = mixGaussFit(stackedData, nstates,  'verbose', false, 'maxIter', 10);
Error in hmmFitEm>initGauss (line 146)
        model = initWithMixModel(model, data);
Error in hmmFitEm>@(m,X,r)initFn(m,X,r,emissionPrior) (line 45)
initFn = @(m, X, r)initFn(m, X, r, emissionPrior);
Error in emAlgo (line 56)
model = init(model, data, restartNum);
Error in emAlgo (line 38)
        [modelsi, llhistsi] = emAlgo(model, data, init, estep,...
Error in hmmFitEm (line 46)
[model, loglikHist] = emAlgo(model, data, initFn, @estep, @mstep, EMargs:);
Error in hmmFit (line 69)
[model, loglikHist] = hmmFitEm(data, nstates, type, varargin:); 

当我尝试运行示例代码时,它可以工作,但我似乎无法弄清楚原因:

data = [train4'; train5'];
data = data2;
d = 13;

% test with a bogus prior
if 1
    prior.mu = ones(1, d);
    prior.Sigma = 0.1*eye(d);
    prior.k = d;
    prior.dof = prior.k + 2;
else 
    prior.mu = [1 3 5 2 9 7 0 0 0 0 0 0 1];
    prior.Sigma = randpd(d) + eye(d);
    prior.k = 12;
    prior.dof = 15;
end

model = hmmFit(data, 2, 'gauss', 'verbose', true, 'piPrior', [1 1], ...
    'emissionPrior', prior, 'nRandomRestarts', 2, 'maxIter', 10);

请解释一下我对 HMM 有什么误解

【问题讨论】:

【参考方案1】:

我尝试了很多东西,直到我决定缩短我的数据以使它们的大小相同。那行得通,让我发现有些块有效,有些会导致错误。仔细检查是因为数据中有几个 NaN,而 HMM 不知道如何处理它们。

【讨论】:

以上是关于多元隐马尔可夫模型实现问题的主要内容,如果未能解决你的问题,请参考以下文章

隐马尔可夫模型

机器学习算法之——隐马尔可夫模型(Hidden Markov Models,HMM) 代码实现

如何用简单易懂的例子解释隐马尔可夫模型

隐马尔可夫模型

自然语言处理隐马尔可夫模型Ⅰ马尔可夫模型

HMM(隐马尔可夫模型)