師兄,不好意思,寫報告時考慮到,下午提到的方法不能解決當前的問題,我會先完成當前GPU實現,同時考慮其他的解決方法或其他聚類算法。
1.問題來源
對于masked_EM?算法,其實是GMM(高斯混合模型)算法的擴展版本,那么masked_EM?算法也同樣分E步和M步進行迭代,具體過程如下:
M步:
E步:
我們可以看到在M步計算出sigma后,更新E步需要求sigma的逆矩陣,但直接經過M步得到的協方差矩陣并不能保證是可逆的,在目前的Python和C++的代碼中,處理方法都是如果該cluster的cov不可逆,直接丟棄該cluster(代碼中將該cluster的id標為0)。
因為目前的小數據跑的實驗結果,經常有協方差矩陣不可逆,對小數據本來信息就不夠,如果丟棄一部分cluster,性能可能會更差,所以我在網上找到一篇博客,關于如何處理GMM算法中協方差矩陣不可逆的問題:Click here~
這篇博客很清楚的講解了如何處理計算出的協方差矩陣出現不可逆,但協方差矩陣為什么不可逆,我之前并沒有深入思考,作者這樣解釋:
那么我們之前的關于協方差矩陣不可逆問題差不多可以解決了,但是如上面的作者提到的,當數據維度(目前32信道,每個信道3個主成分,即96?維)大于數據點數(spike的個數)時,很可能出現overfiting,我想效果也是不好的,我目前的Python的代碼和C++代碼跑了0.5s數據(10000個采樣點*32信道)和2.5s數據,0.5s分類的效果很差,Python的結果只分出了噪聲類和另外一個類,2.5s的效果好一點:
2.解決方案
基于上面的GMM算法在小數據集上的表現不佳,我認為有兩種思路可以考慮:
思路一:GMM算法的性能取決于數據集的大小(更嚴格的說取決于所選數據集里面檢測到的spike的個數),那么只要使數據集盡可能大,那么就可以盡量保證在不更換或改進當前masked_EM算法的基礎上,得到比較好的性能,而我們最大的數據集的大小取決于我們達到實時的目的下能處理的最大的數據量,但是現在由于GPU端的代碼并沒有完成,所以無法確定我們的數據塊最大要多大,我會盡快完成后面的聚類算法的GPU實現,從而驗證是否數據量過小。
思路二:由于這個問題的關鍵是由于cluster的協方差矩陣引起的,其中涉及的參數有spike的個數和數據的維度,也就是說只需要PCA之后提取的spike的特征,之前我們的思路是基于采樣點的window_base,每個窗口(我們實時所能計算的最大的數據量)提取的spike進行處理,這樣可以粗略保證窗口的大小(采樣點的個數),但是每個window產生的spike的數量可能比較少,就容易出現上面的不可逆現象。
那么我們可以基于spike的個數的Window_base,即每個協方差的spike的個數可以大于維度,從而減小協方差矩陣的不可逆的概率。
后來又認真的考慮了一下,cov的計算是考量一個cluster內的所有spike的特征之間的相關性,那么隨著EM算法的迭代,我們無法確定每一個cluster中的spike的個數,所以上面的不可逆及overfiting問題基于spike的個數的Window_base的方法行不通。
更新于9.28討論之后。。。
師兄:
我看了這個這個報告。在里面引用的文章里,作者也講了,要么增加訓練數據的量,要么降低模型復雜度,也就是要減少我們模型里的參數。但是我們模型里的參數其實就是已經被算法固定好了。但是我們的基于window來實現real time想法里,要么就是改變window的大小增加包含的spike的數,從而使每一個窗口的取逆操作都可行,要么就是考慮上一個窗口的數據(中間或者結果數據)在一定程度上在下一個窗口得到復用,這樣既能保證實時,也不需要所有數據ready了才能進行處理。換句話說,我們有兩層的window,第一層的窗口都比較小,包含的spike也較小,所以分出來的類也比較粗。第二層“隱含”的窗口的較大,但是它里面的數據是前面已經粗略分過類的spike加當前的第一層小窗口的數據。這些數據包含的spike數較多,從而能保證每一個這樣的大窗口所得到的cluster都有足夠的spike,從而可以直接套用他們的算法,而且計算量也不會太多(因為已經有前面的粗略分類結果)。
我:
①我們的代碼中,默認參數初始cluster的個數為500,當然我們可以改小一點,但即使改為50,那么對于一個window,假設我們檢測到了500個spike,那么最壞的情況就是每個cluster只有50個spike,那么對于當前的cluster,50個點96維,并不可逆,同時隨著EM迭代,其實我們無法確定每個簇的spike的個數,但是對于大量spike的數據,那些有大量spike的簇肯定會逐漸趨于穩定,所以他的代碼中直接丟棄不可逆的簇也是可以理解的,但是我們當前的窗口的數據,得到的簇以及簇中的spike的數目遠達不到穩定的狀態。換句話說,取逆操作是基于cluster,是否可逆基于cluster中的spike的數,并不基于window中的總spike數目(雖然總spike越大,某些主要簇越可能越穩定)
②我們肯定要考慮前一個窗口的數據復用,但是目前還沒有思路,師兄說的兩層窗口,感覺有點像RNN(LSTM),當前節點的數據(當前第一層window)加上之前處理出來的信息流(之前所有window的特征),這個我再仔細考慮一下,畢竟之前得到的信息流用什么表征,之后怎么復用沒有考慮過。