Форматирование данных для hmmlearn

Я пытаюсь подогнать скрытую марковскую модель, используя hmmlearn в python. Я предполагаю, что мои данные не отформатированы правильно, однако документация для hmmlearn невелика. Интуитивно я хотел бы отформатировать данные в виде трехмерного массива n_observations x n_time_points x n_features, но hmmlearn, похоже, хочет получить двумерный массив.

import numpy as np
from hmmlearn import hmm
X = np.random.rand(10,5,3)
clf = hmm.GaussianHMM(n_components=3, n_iter=10)
clf.fit(X)

Что дает следующую ошибку:

ValueError: Found array with dim 3. Estimator expected <= 2.

Кто-нибудь знает, как отформатировать данные, чтобы построить HMM, который я после?

2 ответа

Решение

Примечание. Все нижеизложенное относится к текущей не выпущенной версии 0.2.0 hmmlearn, Версия 0.1.0, доступная в PyPI, использует другой API, унаследованный от sklearn.hmm,

Чтобы приспособить модель к нескольким последовательностям, вы должны предоставить два массива:

  • X --- объединение данных из всех последовательностей,
  • lengths --- массив последовательностей.

Я попытаюсь проиллюстрировать эти соглашения на примере. Рассмотрим две одномерные последовательности

X1 = [1, 2, 0, 1, 1]
X2 = [42, 42]

Чтобы передать обе последовательности .fit метод, нам нужно сначала объединить их в один массив, а затем вычислить массив длин

X = np.append(X1, X2)
lengths = [len(X1), len(X2)]

В случае наблюдения одного временного ряда метод подгонки hmmlearn предполагает, что данные будут находиться в двухмерном векторном столбце, который можно получить с помощью преобразования (-1,1):

X = np.array([1, 1, 0, -1, -1])
model = hmm.GaussianHMM(n_components=2, n_iter=100)
model.fit(X.reshape(-1,1))
Другие вопросы по тегам