1

我是HMM的新手,但我嘗試使用Jahmm爲UCI人員活動識別數據集創建代碼。該數據集有561個特徵和7352行,還包括加速度計和陀螺儀的xyz慣性值,主要用於識別6個活動:步行,樓上走,樓下步行,坐下,站立和鋪設。到目前爲止,我曾嘗試以下:如何提高準確度? - 使用連續隱馬爾可夫模型(Jahmm)的活動識別

隨着XYZ慣性值:

  1. 對於各條活動的,我訓練6級的HMM爲每個軸(對於 兩個加速度計和陀螺儀),僅使用針對相應HMM的活動訓練數據 。對於每項活動,我還對所有軸的概率(即應用於 測試數據)應用了相等的權重 ,並將它們全部添加以獲得每項活動的總和。 最大概率將是挑選出的最大概率。 (我在 這一次沒有運氣,有超高精度的活動在 同時超低其他)注意:我使用了「ObservationReal」,6 狀態(實際狀態爲2-10)和只是將HMM的初始值統一分開 。我有時會獲得NaN值爲 的一些活動。
  2. 我也嘗試在R中先縮放(z-score)數據,然後應用上述方法 ,但仍無濟於事。
  3. 我也嘗試用「ObservationVector」編碼慣性值, ,但我不知道如何設置最初的Opdfs(它說 它必須是一個正定矩陣)。

隨着特徵值:

  1. 我發現功能集只是太大,無法Jahmm運行,所以 與上述縮放數據(因爲我無法得到與 拿得出手的成績雖然它是標準化的[-1,1]),我跑了 列車和測試數據的R PCA和相關性之前,我喂他們 我jahmm代碼(其中包括六個6 - 狀態HMM,每 活動,對測試數據採取最大概率),並且 結果仍然是n非常好。特別是座位活動,其中總是有20%左右的準確度。 (與上面的 「注意」相同的參數)
  2. 我運行randomRorest與R(與mtry = 8)上的相同數據,並得到 的重要性值。我首先用119個變量分隔了機車和靜態活動 ,然後用89個特徵 (基於RF重要值)和靜態活動(坐, )分類機車 活動(Walking,W. Upstairs,W. Downstairs)鋪設)5個變量。靜態活動的分離很容易(2個狀態,100%),但是這種方法與 調整後的HMM參數相比,我只增加了86%的總體精度。 (用於第二級的 三態HMM)
  3. 我爲所有活動培訓了一個HMM,其中有6個州(對應於 至1個活動,正如我在一篇論文中所閱讀的)。但我無法弄清楚 之後如何使用維特比。它告訴我維特比需要 List<Observation O>測試序列,但我顯然有我的測試數據 List<List<ObservationReal>>

我也曾嘗試HMM包在R:

  1. depmixS4 - 沒有維特比,我不知道怎麼去用測試數據( 後驗概率它給人的probs與 只有列車數據);我試過聯繫 包的作者,他試圖幫助我,但他告訴我嘗試 的代碼給我錯誤(我還沒有給他發郵件)。
  2. RHmm - 首先像魅力一樣;對所有列車數據僅訓練了一個6態HMM ,但產生了nans,導致維特比與測試數據有差的序列 。

根據我迄今爲止所讀到的關於HMMs,這些結果對於HMM來說太低。難道我做錯了什麼?在使用上述技術之前,我應該做更多的預處理嗎? HMM/Jahmm的數據真的太大了嗎?我是否過度配合?我現在被卡住了,但我真的必須爲我的項目做活動識別和HMM。我很樂意從已經嘗試過Jahmm和R的持續HMM的人那裏得到建議/反饋。我也願意學習其他語言,如果這意味着它最終會奏效。

+0

你的問題很長,HMM是一個非常專業的話題。如果您將問題簡化爲基本問題並且/或者將其分解爲幾個較小的問題,則可以提高您的答案几率,因爲您在這裏結合了相當多的內容。例如。 「弄清楚如何設置最初的Opdfs」(不管那是什麼)可能是一個你可以分開的問題。 – zapl

+0

謝謝。我會按建議分開它們。 – user3416268

回答

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. 節省存儲器我用下面的訓練HMM使用BaumWelch並測量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,然後看看哪個是更大的將是一個序列。

我希望這可以幫助你或其他人;如果還不算太晚。