Вопрос реализации многомерной скрытой модели Маркова - PullRequest
0 голосов
/ 01 октября 2018

Я должен классифицировать сигнал от трекера глаз.У меня есть один вектор, представляющий скорости глаза в данный момент времени.Идея состоит в том, что, когда скорость низкая, велика вероятность того, что это фиксация, а когда скорость высокая, это саккада.Каждая точка зависит от предыдущей, т.к.Это приводит к использованию многомерной скрытой марковской модели (HMM) для классификации саккады.Модель представляет собой систему из двух состояний, такую ​​как this .У меня есть всего 8 параметров для изучения, среднее значение и дисперсия для каждого гауссиана, и две вероятности перехода для каждого состояния.Для оценки параметров я использую MATLAB с инструментарием PMTK3.Я не нашел других наборов инструментов MATLAB, которые позволяют HMM с гауссианами.Мой код выглядит так:

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)
        [models{i}, llhists{i}] = 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 = data{2};
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 Ответ

0 голосов
/ 02 октября 2018

Я много пробовал, пока не решил сократить свои данные, чтобы их размеры были одинакового размера.Это сработало и заставило меня обнаружить, что некоторые куски работают, а некоторые вызывают ошибки.После тщательной проверки это произошло потому, что в данных было несколько NaN, а HMM не знал, что с ними делать.

...