2012-01-20 119 views
2

我在做Python手勢識別和一個更完整的庫,我發現可以管理隱馬爾可夫模型是nltk。但有些東西我無法理解。初始化HiddenMarkovModelTrainer對象

首先是數據。我有姿態的座標,我已經將它們聚類在8個聚類中(用k-means)。所以這是我的手勢結構:

raw coordinates x,y: [[123,16], [120,16], [115,16], [111,16], [107,16], [103,17], ...] 

centroids x,y : [[ 132.375  56.625  ] 
       [ 122.45454545 30.09090909] 
       [ 70.5   27.33333333] 
       ...] 

labels: [5 6 6 6 6 6 6 2 2 2 2 2 2 4 4 4 ...] 

現在我想訓練與鮑姆韋爾奇HMM與我的。所以HiddenMarkovModelTrainer是我的課程。

我在互聯網上發現了一些更多的baum welch實現,但只在Matlab中。這樣做的實現算法tipically需要這樣輸入:

baum-welch(X, alphabet, H) 

其中 - X是火車上的數據(在我的情況 - 標籤) - 字母表中數據的可能值(在我的情況 - 0,1 ,2,3,4,5,6,7) - H隱藏狀態

現在我很困惑,因爲在ntlk.HiddenMarkovModelTrainer構造我得給狀態符號我不要數量」不知道應該是什麼,考慮到訓練X的數據是HiddenMarkovModelTrainer.t的輸入rain_unsupervised()方法,我認爲我的字母表是符號..我不知道要在狀態中放置什麼。

我希望我的解釋清楚,即使我的英語很差。

回答

4

隱馬爾可夫模型被稱爲是因爲他們的實際狀態是不可觀察的;相反,各州產生一定概率的觀察結果。在NLTK中經典使用HMM是POS標記,其中觀察是詞,隱藏的內部狀態是POS標記。請看this example以瞭解在這種情況下參數statessymbols的含義。

手勢識別與HMM的觀察是某種幾何輸入數據的特徵建模(symbols)的時間序列 - 在你的情況,你可以使用集羣(也稱爲「分區」 - 看到section 3.2 of this paper ("Yang, Xu. Hidden Markov Model for Gesture Recognition")一些其他可能楷模)。就我的理解而言,這組內部狀態沒有任何有意義的解釋。在每個手勢的HMM訓練中使用的內部狀態的數量只是一個參數,必須進行實驗。例如,請參閱this paper ("Yamato, Ohya, Ishii. Recognizing Human Action in Time-Sequential Images using HMM") - 狀態數量設置爲36,這在this master thesis中被批評爲過高,僅舉例說明這是一個可修改的參數。

所以我會用這個代碼試試:

observed_sequence = [5, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 4, 4, 4] 
states = range(20) # experiment with this number 
symbols = set(observed_clusters) 
trainer = HiddenMarkovModelTrainer(states, symbols) 
model = trainer.train_unsupervised([observed_sequence]) 
+0

感謝的回答和鏈接,很clear.sorry但在你的例子,我有一些錯誤。首先,*'set'對象不支持索引*。如果我使用列表而不是集合,我會得到:*''int'object is unsubscriptable'* – nkint

+0

如果我使用像'a','b','c'等觀察序列和符號字符, model.probability(['a','b'])或​​model.probability('ab')我得到*'IndexError:字符串索引超出範圍'* – nkint

+0

對不起,關於代碼中的錯誤,我的版本的NLTK患者從HMM培訓師的錯誤(http://code.google.com/p/nltk/issues/detail?id=681#c0)...關於使用模型。概率「:這個方法需要一系列標記的標記,因爲它的主要目的是POS標記,所以試着像這樣傳遞你的輸入:'[('a',None),('b',None)]' – wutz