2

我是 HMM 的新手,但我尝试使用 Jahmm 为 UCI 人类活动识别数据集构建代码。该数据集有 561 个特征,7352 行,还包括加速度计和陀螺仪的 xyz 惯性值,主要用于识别 6 种活动:步行、步行上楼、步行下楼、坐着、站立和躺着。到目前为止,我已经尝试了以下方法:

使用 xyz 惯性值:

  1. 对于 6 项活动中的每一项,我为每个轴(加速度计和陀螺仪)训练了 6 个 HMM,仅使用相应 HMM 的活动训练数据。对于每项活动,我也对所有轴的概率(即,当应用于测试数据时)应用相同的权重,并将它们全部相加以获得每个活动的总数。最大概率将是被选中的那个。(这个我运气不好。有超高准确率的活动同时对其他人超低。)注意:我使用“ObservationReal”,6个状态(实际上是2-10个状态),并且只是均匀划分HMM 的初始值。我有时会得到一些活动的 NaN 值。
  2. 我还尝试先在 R 中缩放(z-score)数据,然后应用上述方法,但仍然无济于事。
  3. 我还尝试使用“ObservationVector”对惯性值进行编码,但我不知道如何设置初始 Opdf(它说它必须是一个正定矩阵)。

具有特征值:

  1. 我发现功能集太大而无法在 Jahmm 上运行,因此使用缩放数据(因为我无法使用开箱即用的数据获得任何体面的结果,尽管它已标准化 [-1,1]) ,我在我的 Jahmm 代码(由六个 6 态 HMM 组成,每个活动对应每个活动,使用测试数据取最大概率)之前,在 R 上运行了 PCA 和相关性的训练和测试数据,结果是还是不太好。尤其是坐姿活动,其准确率始终在 20% 左右。(与上述“注”参数相同)
  2. 我用 R 上的相同数据(mtry=8)运行了 randomForest,并得到了重要性值。我首先用 119 个变量将机车活动和静态活动分开,然后将机车活动(步行、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>>我的测试数据。

我还在 R 中尝试过 HMM 包:

  1. depmixS4 - 没有维特比,我不知道如何用测试数据获得后验概率(它只给出火车数据的概率);我已经尝试联系包的作者,他试图帮助我,但他告诉我尝试的代码给了我错误(我还没有给他发电子邮件)。
  2. RHmm - 一开始就像一个魅力;只用所有训练数据训练了一个 6 状态 HMM,但产生了 nans,导致测试数据的维特比序列不好。

根据我目前所读到的关于 HMM 的内容,这些结果对于 HMM 来说太低了。难道我做错了什么?在使用上述技术之前我应该​​做更多的预处理吗?对于 HMM/Jahmm 来说,数据真的太大了吗?我过拟合了吗?我现在卡住了,但我真的必须为我的项目做活动识别和 HMM。我很高兴能从已经尝试过 Jahmm 和 R 进行连续 HMM 的人那里得到建议/反馈。我也愿意学习其他语言,如果这意味着它最终会奏效的话。

4

1 回答 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. 我使用以下方法使用 BaumWelch 训练 HMM,并测量了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 中的每一个计算它,然后看哪个更大的代表一个序列。

我希望这可能对您或其他人有所帮助;如果还不算太晚。

于 2014-04-19T00:27:49.773 回答