2013-07-11 62 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更强大,并被广泛接受,并有大量的理论支持。 –