2013-07-11 59 views
0

一直在探索爲匯聚的時間序列數據的類型是不同的選擇:聚類時間戳序列(兩個事件的時間序列數據)

兩個不同的事件 - 說的1,2-

事件時間(毫微秒)

  1. 1 1E3
  2. 1 6E3
  3. 1 8E3
  4. 2 12e3
  5. 1 54e3
  6. 1 58e3
  7. 1 62e3
  8. 1 67e3
  9. 1 70e3
  10. 1 75e3
  11. 2 103e3
  12. 2 108e3
  13. 2 114e3
  14. 等等

即,時間是隨機的(按指數分佈)並記錄事件1或事件2。錄音時間爲納秒。數據集很大,上升到15-20米,並有數百萬點

事件是相關的,因此可能發生一堆2或1。例如,將會有小塊(1毫秒長的塊有100-200個這兩種類型的事件)。有些情況下,只會發生一系列需要丟棄的事件類型。 而大多數情況下,只記錄單個或幾個事件&這只是噪聲(> 80%的數據)。

這顯然是一個時間序列數據,帶有事件類型信息。

我想應用聚類方法來識別有意義的小塊。我正在使用Matlab,並試圖查看諸如DBSCAN,k-means(由於我不知道簇的先驗數量而沒有用)等選項,

(記錄時間本身可以作爲(x1,x2)= abs(x2(2)-x1(2)),如果x是(事件,時間);則還有一個「距離」,因爲這些是連續的組塊,時間= 10.2到10.23秒,與其他任何部分沒有任何關係,即聚類僅用於「識別」短片段(預計在整個數據集中只有幾萬個)

任何幫助將不勝感激!謝謝。

+0

你看過'clusterdata()'嗎? – Oleg

+0

是的。由於數據集龐大,內存不足問題,儘管我可以迭代更小的長度)。但我不知道如何提取我想要的相關部分。 – nahsivar

+0

您是否嘗試了savememory選項?此外,請詳細說明「有意義的事件順序」;從評論到休的回答,似乎你只是通過時間戳進行區分,這已經降低了問題的維度,即僅集羣時間。 – Oleg

回答

1

怎麼樣羚牛g時間點之間的差異,並根據經驗或統計確定事件「連接」以下的閾值?

dtimes=diff(nanotimes); 
THRESH=100; % completely made up - will depend on your data 
current_cluster=1; 
assign_clusters=zeros(size(nanotimes)); 
assign_clusters(1)=current_cluster; 
for (v=1:length(dtimes)) 
    if (dtimes(v)>THRESH) 
     current_cluster=current_cluster+1; 
    end 
    assign_clusters(1+v)=current_cluster; 
end 

for v=1:current_cluster 
    indices=find(assign_clusters==v); 
    if (~any(events(indices)==1)) || ... 
     all(events(indices)==1) || ... 
     (nanotimes(indices(end))-nanotimes(indices(1)) < TIMETHRESH) 

     assign_clusters(indices)=-1; 

    end 
end 
+0

謝謝休,這其實是我一直在做的。不要提到它。由於有意義的事件發生在較短的時間間隔內(一段時間內的事件閾值和dtimes nahsivar

+0

你如何定義有意義的?這是問題的根源! –

+0

將兩個事件混合在一起的片段,不要太長或太短(〜300us - 1ms)。 – nahsivar

0

您可能在錯誤的領域。

聚類分析的目的是爲多維數據,但你只有一個真正的維度,時間。

你真的應該看看經典的統計方法系列,如核密度估計,自然休息優化和這樣的事情。例如,您可以使用內核密度估計器來估計事件1和事件2的密度,然後在事件1或事件2的密度變得比其他事件密度高出某個閾值的情況下分裂數據組。實際上,它非常簡單,一旦你計算出KDE曲線。

+0

感謝您參考KDE等統計方法。已經遇到它但以前沒有用過。比上面簡單的基於時間的過濾有效嗎?你有任何特定的代碼示例。 – nahsivar

+0

KDE更強大,並被廣泛接受,並有大量的理論支持。 –