Как повысить точность? - Распознавание активности с использованием непрерывных скрытых марковских моделей (Джамм)

1

Я новичок в HMM, но я попытался создать код, используя Jahmm для набора данных UCI Human Activity Recognition. Набор данных имеет 561 функцию и 7352 строки, а также включает и инерционные значения xyz как акселерометра, так и гироскопа, и это в основном для распознавания 6 видов деятельности: ходьба, прогулка по лестнице, прогулка по лестнице, сидение, стоя и укладка. До сих пор я пробовал следующее:

При инерциальных значениях xyz:

  1. Для каждого из 6 видов я обучил 6 HMM для каждой оси (как для акселерометра, так и для гироскопа), используя только данные поезда для соответствующего HMM. Для каждого действия также я применял равные веса по всем вероятностям осей (т.е. При применении к тестовым данным) и добавлял их все, чтобы получить общее количество для каждого вида деятельности. Максимальная вероятность будет выбрана. (Мне не повезло с этим. Есть действия с супер высокой точностью, в то же время сверхнизкие на других.) Примечание: я использовал "ObservationReal", 6 состояний (на самом деле, 2 состояния -1 0], и просто равномерно разделенные начальные значения для HMM. Иногда я получаю значения NaN для некоторых видов деятельности.
  2. Я также попытался масштабировать (z-score) данные сначала в R, а затем применить вышеупомянутый метод, но все же безрезультатно.
  3. Я также пробовал кодировать инерционные значения с помощью "ObservationVector", но я не мог понять, как установить исходные Opdf (он говорит, что он должен быть положительно определенной матрицей).

С значениями функции:

  1. Я обнаружил, что набор функций слишком велик для работы на Jahmm, поэтому с масштабированными данными (потому что я не смог получить достойные результаты с готовыми данными, хотя он нормализовал [-1, 1]), Я запустил поезд и проверил данные по R для PCA и корреляции, прежде чем я накормил их на своем коде Jahmm (который состоит из шести 6-говых HMM, каждый для каждого действия, с максимальной вероятностью с тестовыми данными) и результатов все еще не так хороши. В частности, Сидящая деятельность, которая всегда получает около 20% точности. (Те же параметры, что и "Примечание" выше)
  2. Я запускал randomForest с теми же данными на R (с mtry = 8) и получил значения важности. Я разделил локомотив и статические действия сначала на 119 переменных, затем классифицировал деятельность локомотива (Walking, W. Upstairs, W. Downstairs) с 89 функциями (на основе значений значения RF) и статическими действиями (Sitting, Standing, Laying) с 5 переменные. Разделение локомотива и статической активности легкое (2 состояния, 100%), но этот метод, с скорректированными параметрами HMM, я получил только общую точность 86%. (Используемые трехмерные состояния HMM для второго уровня)
  3. Я тренировал одну HMM для всех видов деятельности, с 6 состояниями (что соответствует 1 активности, как я читал в одной статье). Но я не мог понять, как использовать Витерби после этого. Это говорит мне, что Viterbi нуждается в List<Observation O> тестовых последовательностях, но у меня, очевидно, есть List<List<ObservationReal>> для моих тестовых данных.

Я также пробовал пакеты HMM в R:

  1. depmixS4 - не имеет viterbi, и я понятия не имею, как получить задние вероятности с тестовыми данными (он дает информацию только с данными поезда); Я попытался связаться с автором пакета, и он попробовал помочь мне, но код, который он мне сказал, чтобы попробовать, дает мне ошибки (я еще не вернул ему письмо).
  2. RHmm - работает как прелесть сначала; обучил только один 6-говый HMM со всеми данными поезда, но производит nans, что приводит к плохой последовательности viterbi с данными теста.

Согласно тому, что я читал о HMM до сих пор, эти результаты слишком низки для HMM. Я делаю что-то неправильно? Должен ли я делать больше предварительной обработки, прежде чем использовать указанные методы? Действительно ли данные слишком велики для HMM/Jahmm? Я перерабатываю его? Я застрял сейчас, но мне действительно нужно сделать Activity Recognition и HMM для моего проекта. Я был бы рад получить предложения/отзывы от людей, которые уже пробовали Jahmm и R для непрерывных HMM. Я также открыт для изучения других языков, если это будет означать, что это, наконец, сработает.

Теги:
android-sensors
hidden-markov-models
activity-recognition

1 ответ

1

Я просто наткнулся на ваш вопрос, ища масштабируемую библиотеку Java. Кажется, вы не тренировали HMM должным образом. Когда я впервые использовал HMM, я также не смог получить правильные результаты. Я использовал R для обучения и тестирования HMM, вот несколько советов, которые могут вам помочь.

  1. Правильно назначать случайные начальные состояния при инициализации состояний и наблюдаемых вероятностей. Вот фрагмент кода из 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)
    
  2. Попытайтесь сократить свои ряды в короткие последовательности. Я использовал метод раздвижного окна, чтобы нарезать их, а затем удалить избыточные, чтобы избежать переподготовки и сэкономить время.

  3. Вы можете сохранить память, заменив строку, наблюдаемую целым числом или символом

  4. Я использовал для обучения 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, которую вы обучили, а затем посмотрите, какая из них больше будет представлять последовательность.

Надеюсь, это может помочь вам или кому-то еще; если не поздно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню