我正在使用来自 Android 可穿戴设备的加速度计和陀螺仪的传感器数据来训练在 JaHMM 中实现的 HMM。
使用加速度计数据训练的 HMM 输出精细的学习状态,并且具有某种程度上可接受的错误率。
两个 HMM 的初始化如下:
Hmm<ObservationVector> hmm = new Hmm<>(2, new OpdfMultiGaussianFactory(3));
hmm.setPi(0, 0.5);
hmm.setPi(1, 0.5);
hmm.setOpdf(0, new OpdfMultiGaussian(
new double[]{0,0,0},
new double[][] {{0.1,0,0},
{0,0.1,0},
{0,0,0.1}
}));
hmm.setOpdf(1, new OpdfMultiGaussian(
new double[]{0,0,0},
new double[][] {{0.1,0,0},
{0,0.1,0},
{0,0,0.1}
}));
hmm.setAij(0, 0, 0.5);
hmm.setAij(0, 1, 0.5);
hmm.setAij(1, 0, 0.5);
hmm.setAij(1, 1, 0.5);
使用加速度计数据训练的 HMM 的输出:
HMM with 2 state(s)
State 0 Pi: 0.5000000000000188 Aij: 0.5 0.5 Opdf: Multi-variate Gaussian distribution --- Mean: [ 0.036 -0.051 0.075 ]
State 1 Pi: 0.5000000000000188 Aij: 0.5 0.5 Opdf: Multi-variate Gaussian distribution --- Mean: [ 0.036 -0.051 0.075 ]
但是,无论我尝试了多少次训练迭代(500 次迭代),使用陀螺仪数据训练的 HMM 似乎都无法了解 HMM 的状态。例如学习到的状态概率只是 NaN
使用陀螺仪数据训练的 HMM 的输出:
HMM with 2 state(s)
State 0 Pi: NaN Aij: ? ? Opdf: Multi-variate Gaussian distribution --- Mean: [ ? ? ? ]
State 1 Pi: NaN Aij: ? ? Opdf: Multi-variate Gaussian distribution --- Mean: [ ? ? ? ]
造成这种行为的原因是什么?在数据可用于 HMM 之前,我是否需要执行预处理或标准化步骤? HMM 中的状态数量是否不足?我尝试了五个状态,但得到了相同的结果。
可以在此处查看加速度计训练文件的片段: https://gist.github.com/Gudui/91d2c6b2452f1ea6a5c925b1eed9b40c
可以在此处查看陀螺仪训练文件的片段: https://gist.github.com/Gudui/987cc1c1a7c0311a03988b818e7cbbcb
对于这两个训练文件,每一行代表一个训练序列。
该库可在此处获取:https://github.com/tanjiti/jahmm
提前致谢!
最佳答案
详细阐述我的评论,我建议:
- 使用高斯 pdf 的随机初始化,即不是将均值向量初始化为
[0,0,0]
,并将协方差矩阵初始化为单位矩阵的 0.1 倍,就像您现在所做的那样,根据您的数据使用一些随机值或一些经验平均值和协方差。 - 美白您的数据,即确保每个坐标的均值和单位方差为零(甚至使用 PCA 使坐标不相关。
关于machine-learning - 分类 HMM 陀螺仪数据 Jahmm 无法学习模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42881956/