在對時間序列進行分類時,隱馬爾科夫模型、人工神經網路和支持向量機這三種模型哪種更合適,為什麼?

假定我們需要對一個維度為d且長度為n的時間序列進行分類。我們可以把它表示成一個長度為d*n的向量,然後使用ANN或SVM進行分類,我們也可以把時間序列的d維特徵作為觀察值,然後使用HMM進行分類。那麼,到底哪一種方式更適合對時間序列進行分類?把時間序列生硬地當做一個向量來進行處理是否有不妥之處?能否舉例說明?

---------------------------------------

問題描述不夠清楚,導致部分答主出現了理解偏差,抱歉。

題主的本意是對時間序列進行模式匹配,希望把「長得像」的時間序列分到同一個類別中。

舉一個簡單的例子,以橫軸為時間,縱軸為某機場客流量為例,

如果時間段[a,b]和時間段[c,d]內,客流量走勢均為字母w形,那麼我希望他們被分到同一類。

由於模式可能出現時間上的扭曲(類似於語音識別中dtw演算法處理的問題),所以感覺用ann或者svm恐怕不太合適。可況且,時間段[a,b]和[c,d]不是等長的。


題主希望把「長得像」的時間序列分到同一個類別中,而且時間段不等長,可以考慮一些傳統方法:PAA和landmark.

PAA (Piece-wise Average Approximation)把不同時長的序列都分成n段,每段取它的均值,這樣每個時間序列都變成了n維的特徵,然後你就可以用歐式距離或者餘弦計算相似度了。問題是:分段大丟失信息多,分段小降維程度低,關鍵是如何選擇合適的線段數和合適的分段點。

有個改進叫APCA, 根據時間序列變化自動確定是否分段,每個子段用該子段上各點的平均值來表示。(Keogh E, Chakrabarti K, Pazzani M, et al. Locally Adaptive Dimensionality Reduction for indexing Large Time Series Databases. ACM Transactions on Database Systems, 2002, 27(2):188~228. )

界標模型(landmark)將時間序列中一些轉折點定義為界標,如局部極大值、極小值和拐點等。每個序列都要對數值標準化,然後通過限定界標的變化幅度和持續時間找出最重要的n個界標。最後用這n個界標計算相似度。(Peng Changshing, Wang Haixun, Zhang Sylvia R, Parker D Stott. Landmarks: A New Model for Similarity-Based Pattern Querying in Time Series Databases[D]. Feb: Proc 16th IEEE Int』1 Conf on Data Engineering, 2000, 675~693)


抽象地看,我們考慮輸入一個序列,輸出一個類別這樣的機器學習問題。

如果輸入就已經是一個向量的序列,不考慮效果、實際意義等,我們沿著時間軸用maxmeanlast Instance等pooling操作,就可以把輸入向量序列變換成一個向量,然後再接一個分類器(例如題主提到的SVM),就可以對整個序列做分類了。但是輸入向量序列,作為原始數據的數字表示,未必是直接就能很好用於分類的,所以問題重點在於如何把輸入向量序列變換到一個更佳的向量序列表示(類似deep learning裡面不斷疊加隱層的變換,最後再接到lr之類的分類器)。

一個初始的想法是,在每個時間步的向量v_t,都過同一個非線性函數f(v_t),輸出向量u_t=f(v_t)。這裡f可以是一個小型的神經網路,或者其他什麼模型。這樣就實現了序列的非線性變換,通過學習也許就能學出一個比較好的函數f。但這樣的模型會導致無論輸入序列怎麼重排序,輸出的向量的集合都是固定的,那麼最後取maxmeanlast Instance必然都是一樣的輸出結果,因此完全沒有利用序列的信息。

怎麼才是利用序列信息?抽象地看,同樣的向量v,在不同時刻輸入,其輸出f(v)應該是不一樣的向量。DNNLRGBDT等等模型,從數學上看都是一個純函數,同樣的輸入一定會得到同樣的輸出(或者從C++的角度,是一個函數體內只用到局部變數的函數)。而如果要建模序列,我們就需要使用RNN之類的具有狀態的模型函數。因為有內部狀態s的存在,同樣的輸入向量v,在不同時刻的輸出是f(s_t, v),當然就可以不同了。狀態和時間是共生的關係,因為有狀態的演化,我們才能察覺到時間流的存在,也正是因為時間流,導致了狀態的演化。

不失一般性,我們直接取狀態作為輸出(如果想更一般,可以再對狀態做個非線性變換),這樣輸入向量序列v_{1:t}就變換到了s_{1:t},其中s_t=f(s_{t-1},v_t)。於是如果:

  1. 狀態是categorical的:那麼就是一個有限狀態自動機,如果加上概率的演化,那就類似Markov的狀態轉移,狀態加變換後再輸出,就類似HMM了。

  2. 狀態是continuous的(即mathbb{R}^n中的向量):那麼就是RNN,這裡RNN不是指通常說的單純的線性函數加激活的simple RNN,這裡狀態轉移是一般的非線性函數,但本質上差不多(例如可以疊加多層simple RNN實現)。

由於具有k種取值可能的categorical的變數可以編碼成一個one-hot的k-dimensional的向量,而RNN是k-dimensional的連續向量(也就是distributed representation),因此相比之下,RNN的狀態表達更高效更緊湊。也正因為RNN使用了k-dimensional的連續向量,其狀態個數無窮多,所以由此可以出發證RNN是Turing-complete的(直觀上想像一下,把RNN隱狀態的一部分用於建模圖靈機中有限狀態機部分的狀態及其轉移,另一部分用來存儲圖靈機中無窮長的帶子的信息)。總之(非simple的)RNN一般來說有更強的建模狀態轉移的能力。

我們還可以從另一個角度來考慮序列的建模。同樣的輸入向量v_t,過同樣的純函數f(v_t),得到的結果當然相同。但是如果我們把上下文加入到輸入,即把當前時間附近一個窗口整體V_t=[v_{t-i},v_{t-i+1},...,v_t,...v_{t+j}]看作輸入,那麼過同樣的純函數g(V_t),其輸出也會不同。這種顯式加入上下文的方式也能建模序列信息,CNN就是一種典型。在實際中,由於各種原因,窗口大小一般要預先取定,比如3或者5,那麼顯然更長程的信息在這一次變換之內很難建模,需要疊加多層。針對題主的問題,RNN與CNN兩類思路孰優孰劣,很難預先判斷,只能實驗決定。一些實際的實驗感受,可以參考我的另一個答案在NLP上,CNN、RNN(認為LSTM等變體也是RNN)、最簡單全連結MLP,三者相比,各有何優劣? - 過擬合的回答。


無語。某些人一看就是還沒入門。別總想圖方便把machine learning當黑盒用。你time series是什麼性質的決定用什麼模型。模型背後的原理好好去看看就不用問這個了。

nn你以為就一個呆萌的nn嗎?nn里模型多了去了,06 年lstm rnn都能做自動label sequence了;dae+rnn在語音識別上早乾死hmm了。

nips上還有nonparametric classification for time series別人這三個都沒用,效果不知道好到哪裡了。

跟我讀:只要feature做得好,不怕分類器分不了。

學術能力不行,就多看書多看論文少問點冷飯問題。


沒有最合適,只有嘗試了才知道,你用哪個分類器都說得通。不過啊,嘗試這二字可沒有那麼輕易做到。就說你要神經,能把神經訓好就不是一個容易的事情。


對時間序列做pattern matching, 我見過有幾種做法. 一個是直接從時間序列提取特徵(時域,頻域,時頻分析, cepstrum等等), 然後對這些特徵進行聚類/分類. 或者model based, 對每個時間序列辨識arma, arima等模型, 對係數進行分析. 還有fancy一點的, 對time series做local sensitivity hashing後, 在分析similarity的.


為什麼要用神經網路和支持向量機,這兩個都是監督演算法,你說的這個聚類演算法完全可以使用啊,而且根據「長得像」分為一類,在沒有標籤的情況下不就是典型聚類問題。HMM是強化演算法感覺更用不到了。。。


直接算correlation matrix 然後再對矩陣進行排序分類不行嗎? 下面是滬深300的成份股的分類結果:

分出來的結果和按行業分的結果差不多。當然偶爾能發現有股票串到別的行業那去了的。

作為輔助你還可以算算PCA再套上K-means。

綜合起來這樣的好處之一是不依賴黑盒子演算法。但壞處就是有些奇葩股票容易自成一組。


匿名好犀利,贊

補充:

對這個問題如果是具體個別的項目,比較簡單實用的方法還是人工抽feature,時間序列本身有很多統計特徵,另外還有各類sequential pattern的統計特徵;

如果是個增量的無底洞,在保證計算能力的前提下NN和非參模型都可以滿足要求。


最近也想過這樣的問題,特別是看到RNN/lstm在一些地方取得了很好的效果所以很好奇。匿名的答案我覺得是沒理解這個問題,當然題主提到的分類器都比較傳統了,但把hmm vs svm換成rnn(時序) vs cnn(把時間看成另一維),這個問題同樣值得想一想。 像@張俊博所說把整個時間都拉成特徵維度肯定是太大了。但其實也可以做一個w長的時間的滑窗,在每個窗內d*w大小的特徵上用類似cnn/svm等方法分類,最後對所有滑窗的分類結果估匯總。這樣在模複雜程度上就不比時序模型高太多了。

具體哪種更優可能還得具體問題具體分析了,雖然未必會有人解答,題主還是可以描述一下具體數據。同時期待專業人士解答一下。


不太明白,題主是希望對整個時間序列進行分類,還是對序列中的每一幀進行分類呢?

前者和普通的分類問題一樣,可以用svm,ann等分類器去做;後者應該是序列標註問題,可以用hmm,MEMM,CRF等模型。

hmm是一個模型框架,需要對狀態轉移概率和狀態輸出概率分別建模,dnn/rnn/lstm的思想是對狀態後驗概率建模,從而歸一化得到狀態輸出概率。

相比單獨對每一幀做最大後驗分類,hmm引入了前後幀之間的類別跳轉約束,即狀態轉移圖。在語音識別中,狀態轉移圖可以描述語言模型、發音詞典和context dependency,引入這些上下文知識後,識別出來的句子更接近自然語言。


這種問題,可以考慮傳統上的小波分析、傅里葉分析,或者使用動態時間規整DTW演算法,都是一些研究的比較成熟的方案了


我比較喜歡打破別人的幻想。弄死每個人的希望是我的追求。反問題主,就算用一大堆高大上的東西,完成了你的分類。你能幹嘛?

簡單說,可以分漲和跌。略微複雜點,加一個震蕩。然後呢?把所有時間序列分成三類後,能有效決策了?

可能你會繼續細分,希望細分結果,能呈現出每個分類,至少是某個分類的預測概率比較大。是吧?

你憑什麼相信,當某個分類里只有3個樣本值的時候,不是因為統計偏差,而是因為你找到了有用的形態?

分類粗了,一定沒用。分類細了,憑什麼說服自己這不是過擬合?

所以,試圖對一個近似於隨機分布的序列做分類,沒事混日子可以理解。但是抽空從理論上多想想這麼做究竟有什麼意義。

其實很多事情真的是沒意義的。比如對近似隨機分布的時間序列,在微觀層面做聚類分析。


針對於單個演算法來說,那種演算法更好一般情況下要試了才知道,但是三個融合之後的結果必然大於等於這三個單個的結果


看過一篇文獻,按時間序列對遊戲中的bot進行檢測,用的是滑動窗口截取時間序列,然後用樸素貝葉斯進行分類。


請教一下:哪些場合需要使用時間序列的分類?能否舉幾個例子?謝謝!


推薦閱讀:

如何編寫易被複用的,高質量的機器學習演算法代碼?有哪些這樣的代碼示例?請舉例:代碼,原文,你發表的文獻。
隱馬爾可夫模型是如何應用於語音識別?
AI產品,科學家和程序員分別做什麼,是怎麼分工的?

TAG:機器學習 | 語音識別 | 神經網路 | 時間序列分析 | 馬爾科夫過程 |