分类 HMM 陀螺仪数据 Jahmm 无法学习模型
Classification HMM gyroscope data Jahmm Can't learn model
我正在使用来自加速度计的传感器数据和从 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 使坐标不相关。
我正在使用来自加速度计的传感器数据和从 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 使坐标不相关。