Я новичок в HMM, но я попытался создать код, используя Jahmm для набора данных UCI Human Activity Recognition. Набор данных имеет 561 функцию и 7352 строки, а также включает и инерционные значения xyz как акселерометра, так и гироскопа, и это в основном для распознавания 6 видов деятельности: ходьба, прогулка по лестнице, прогулка по лестнице, сидение, стоя и укладка. До сих пор я пробовал следующее:
При инерциальных значениях xyz:
С значениями функции:
List<Observation O>
тестовых последовательностях, но у меня, очевидно, есть List<List<ObservationReal>>
для моих тестовых данных.Я также пробовал пакеты HMM в R:
Согласно тому, что я читал о HMM до сих пор, эти результаты слишком низки для HMM. Я делаю что-то неправильно? Должен ли я делать больше предварительной обработки, прежде чем использовать указанные методы? Действительно ли данные слишком велики для HMM/Jahmm? Я перерабатываю его? Я застрял сейчас, но мне действительно нужно сделать Activity Recognition и HMM для моего проекта. Я был бы рад получить предложения/отзывы от людей, которые уже пробовали Jahmm и R для непрерывных HMM. Я также открыт для изучения других языков, если это будет означать, что это, наконец, сработает.
Я просто наткнулся на ваш вопрос, ища масштабируемую библиотеку Java. Кажется, вы не тренировали HMM должным образом. Когда я впервые использовал HMM, я также не смог получить правильные результаты. Я использовал R для обучения и тестирования HMM, вот несколько советов, которые могут вам помочь.
Правильно назначать случайные начальные состояния при инициализации состояний и наблюдаемых вероятностей. Вот фрагмент кода из R с использованием библиотеки HMM.
library(HMM)
....
...
ranNum<-matrix(runif(numStates*numStates, 0.0001, 1.000),nrow=numStates,ncol=numStates)
transitionInit <- ranNum/rowSums(ranNum)
ranNum<-matrix(runif(numStates*numSymbols, 0.0001, 1.000),nrow=numStates,ncol=numSymbols)
emissionInit <- ranNum/rowSums(ranNum)
rowSums(emissionInit)
hmm = initHMM(c(1:numStates),symbols,transProbs=transitionInit,emissionProbs=emissionInit)
Попытайтесь сократить свои ряды в короткие последовательности. Я использовал метод раздвижного окна, чтобы нарезать их, а затем удалить избыточные, чтобы избежать переподготовки и сэкономить время.
Вы можете сохранить память, заменив строку, наблюдаемую целым числом или символом
Я использовал для обучения HMM с помощью BaumWelch и измерил logForwardProbabilties
чтобы определить вероятность (не вероятность). Вам нужно суммировать логарифмичность каждого состояния, чтобы получить окончательную вероятность регистрации последовательности
bw = baumWelch(hmm,trainSet,maxIterations=numIterations, delta=1E-9, pseudoCount=1E-9)
logForwardProbabilities <- forward(bw$hmm,validationSet[cnt,])
vProbs<-sum(logForwardProbabilities[,seqSize])
Это отрицательное число, подсчитайте его для каждой из 6 HMMS, которую вы обучили, а затем посмотрите, какая из них больше будет представлять последовательность.
Надеюсь, это может помочь вам или кому-то еще; если не поздно.