我是新机器学习,我正在使用隐马尔可夫模型来识别活动。我有 9 种不同的活动。我正在使用 Jahmm 库。我的数据从加速度计传感器收集。每个样本(2s/样本,50 条记录/秒)的向量如 [270.0 2280.0 390.0 202.706888932921]。首先,我使用 K-means 学习并将所有 HMM 保存在 arrayList 中。然后我比较它们之间有新特征向量时的概率。结果非常好:
Reader reader = new FileReader("My Link file");
List<List<ObservationVector>> sequences = ObservationSequencesReader
.readSequences(new ObservationVectorReader(), reader);
reader.close();
OpdfMultiGaussianFactory gMix = new OpdfMultiGaussianFactory(4);
KMeansLearner kml = new KMeansLearner<>(1, gMix, sequences);
//Hmm hmm1 = kml.iterate();
ArrayList<Hmm> listHmm = new ArrayList<>();
listHmm.add(kml.iterate());
但是, new KMeansLearner<>(1, gMix, sequences) - 这意味着对于每个状态(例如:步行),我只有子状态。但是理论上,每个状态内部都有一些状态。我的工作是识别活动,为什么我需要使用子状态?
我在 github 上阅读了一些项目,大多数作者使用 BaumWelchLearner 来拟合 HMM 的参数。但是当我使用我的数据时,我在两种情况下遇到了一些错误:1:如果我的数据像:
[ 270.0 2280.0 390.0 202.706888932921 ] ;
[ 140.0 2010.0 720.0 165.88948785066606 ] ;
[ 950.0 1850.0 300.0 209.37353643104433 ] ;
[ 220.0 2520.0 540.0 225.51551675635858 ] ;
[ 90.0 1390.0 370.0 92.85073343887925 ] ;
[ 280.0 2970.0 480.0 206.20770830791443 ] ;
[ 340.0 1530.0 160.0 154.4395940899849 ] ;
[ 210.0 3410.0 90.0 208.4459552027285 ] ;
[ 270.0 1570.0 290.0 163.63963507041333 ] ;
[ 360.0 2830.0 620.0 201.01313211023808 ] ;
[ 320.0 1980.0 230.0 120.60316500067711 ] ;
[ 320.0 1940.0 330.0 185.39230969622733 ] ;
[ 310.0 2080.0 780.0 217.30981059428305 ] ;
KMeansLearner kMeansLearner = new KMeansLearner(1,gMix,sequences);
BaumWelchLearner baumWelchLearner = new BaumWelchLearner();
Hmm initHmm = kml.iterate();
Hmm finalHmm = baumWelchLearner.iterate(initHmm,sequences);
我得到错误:观察序列太短,因为每个特征向量都是一个观察值。
2. If my data is :
[270.0 2280.0 390.0 202.706888932921];[140.0 2010.0 720.0 165.88948785066606];[950.0 1850.0 300.0 209.37353643104433];...以及每个观察序列的更多信息
然后,结果非常糟糕,当我使用 ViterbiCalculator 计算它们时,概率为 NA。
我的问题是: 1:为什么我们需要在隐藏马尔可夫模型中使用子状态 2:为什么我使用 BaumWelchLearner 来学习,我的结果很糟糕
对不起我的英语。非常感谢!