2

私は HMM の初心者ですが、UCI Human Activity Recognition データ セット用に Jahmm を使用してコードを作成しようとしました。このデータ セットには 561 の特徴と 7352 行があり、加速度計とジャイロスコープの両方の xyz 慣性値も含まれており、主に 6 つのアクティビティを認識するためのものです: 歩く、上を歩く、下を歩く、座る、立つ、横になる。これまでのところ、次のことを試しました。

xyz 慣性値を使用すると、次のようになります。

  1. 6 つのアクティビティのそれぞれについて、対応する HMM のアクティビティ トレイン データのみを使用して、各軸 (加速度計とジャイロスコープの両方) に対して 6 つの HMM をトレーニングしました。各アクティビティについても、すべての軸の確率に等しい重みを適用し (つまり、テスト データに適用した場合)、それらをすべて加算して各アクティビティの合計を求めました。最大の確率は、選ばれたものになります。(私はこれに運がありませんでした。他のものでは同時に超低精度のアクティビティがあります。) 注: 「ObservationReal」を使用し、6 つの状態 (実際には 2 ~ 10 の状態を試しました) を均等に分割しました。 HMM の初期値。一部のアクティビティで NaN 値を取得することがあります。
  2. また、最初に R でデータをスケーリング (z スコア) してから、上記の方法を適用しようとしましたが、それでも役に立ちませんでした。
  3. また、「ObservationVector」で慣性値をコーディングしようとしましたが、最初の Opdfs を設定する方法がわかりませんでした (正定行列でなければならないと言われています)。

特徴値を使用すると、次のようになります。

  1. 機能セットが大きすぎて Jahmm で実行できないことがわかったので、スケーリングされたデータを使用します (正規化されていますが、すぐに使用できるデータでは適切な結果が得られなかったためです [-1,1])。 、PCA と相関のために R でデータのトレーニングとテストを実行してから、Jahmm コード (6 つの 6 状態 HMM で構成され、各アクティビティごとに、テスト データで最大確率を取得します) に入力しました。結果は次のとおりです。まだあまり良くありません。特に座っているアクティビティは、常に約 20% の精度が得られます。(上記「備考」と同じパラメータ)
  2. R で同じデータ (mtry=8) を使用して randomForest を実行し、重要度の値を取得しました。最初に移動活動と静的活動を 119 の変数で分離し、次に移動活動 (歩行、2 階に移動、2 階に移動) を 89 の特徴 (RF 重要度値に基づく) で分類し、静的活動 (座る、立つ、横になる) を 5 の特徴で分類しました。変数。運動活動と静的活動を分離するのは簡単ですが (2 つの状態、100%)、HMM パラメーターを調整したこの方法では、全体の精度は 86% しか得られませんでした。(第 2 レベルには 3 状態 HMM を使用)
  3. 6 つの状態 (1 つの論文で読んだように、1 つのアクティビティに対応) で、すべてのアクティビティに対して 1 つの HMM をトレーニングしました。しかし、その後のビタビの使い方がわかりませんでした。Viterbi には List<Observation O>テスト シーケンスが必要であることがわかりますが、明らかに List<List<ObservationReal>>テスト データが必要です。

RでHMMパッケージも試しました:

  1. depmixS4 - ビタビがなく、テスト データで事後確率を取得する方法がわかりません (トレーニング データのみで確率が得られます)。パッケージの作成者に連絡してみましたが、彼は私を助けようとしましたが、彼が試すように言ったコードでエラーが発生しました (私はまだ彼にメールで返信していません)。
  2. RHmm - 最初は魔法のように機能します。すべてのトレーニング データを使用して 6 状態の HMM を 1 つだけトレーニングしましたが、nan が生成され、テスト データで不適切なビタビ シーケンスが発生しました。

これまで HMM について読んだことによると、これらの結果は HMM には低すぎます。私は何か間違ったことをしていますか?上記の手法を使用する前に、さらに前処理を行う必要がありますか? HMM/Jahmm にはデータが大きすぎますか? 私はそれを過剰に適合させていますか?私は今立ち往生していますが、私のプロジェクトではアクティビティ認識と HMM を実行する必要があります。Jahmm と R を連続 HMM で既に試した人からの提案やフィードバックをいただければ幸いです。それが最終的に機能することを意味する場合、私は他の言語を勉強することにもオープンです。

4

1 に答える 1

1

スケーラブルな Java ライブラリを探しているときに、あなたの質問に出くわしました。HMM を適切にトレーニングしていないようです。HMM を初めて使用したときも、正しい結果を得ることができませんでした。私は R を使用して HMM のトレーニングとテストを行いました。参考になるいくつかの提案を以下に示します。

  1. 状態と観測可能な確率を初期化するときに、ランダムな初期状態を適切に割り当てます。HMM ライブラリを使用した R のコード スニペットを次に示します。

    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 に答える