使用时间戳对序列进行聚类(两个事件的时间序列数据)

时间:2013-07-11 14:54:26

标签: matlab time-series cluster-analysis

一直在探索用于聚类类型的时间序列数据的不同选项:

两个不同的事件 - 比如1,2

活动时间(nanos)

  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. 等等
  15. 即,时间是随机的(指数分布的)并且记录事件1或事件2。录音以纳秒为单位。数据集很大,最高可达15-20 mts,数百万点

    事件是相关的,因此可能发生一堆2或1。例如,将有小块(1毫秒长的块具有100-200个两种类型的事件)。在某些情况下,会发生一系列只需要丢弃的事件类型。 大多数情况下,只记录一个或几个事件。这只是噪音(> 80%的数据)。

    这显然是一个时间序列数据,包含事件类型信息。

    我想应用聚类方法来识别有意义的小块。我正在使用Matlab,并试图研究DBSCAN,k-means等选项(因为我不知道apriori的簇数,所以没用)等,

    (记录时间本身可以作为'距离',因为这些是连续的块。即,dist(x1,x2)= abs(x2(2) - x1(2))如果x是(事件,时间) ; 此外,在时间= 10.2到10.23秒发生的有意义的事件序列与任何其他部分没有任何关系。也就是说,聚类只是为了“识别”短片(预计整个数据集中只有几万个)

    任何帮助将不胜感激!谢谢。

2 个答案:

答案 0 :(得分:1)

如何获取时间点之间的差异,并根据经验或统计确定一个低于事件“连接”的阈值?

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

答案 1 :(得分:0)

你可能正在寻找错误的域名。

聚类分析适用于多维数据,但您只有一个真正的维度,时间。

你真的应该看一下系列的经典统计方法,比如核密度估计,自然中断优化等等。

例如,您可以使用内核密度估算器估算事件1和事件2的密度,然后在事件1或事件2的密度变得高于另一个时,将数据集拆分为一定的门槛。一旦你计算了KDE曲线,它实际上非常简单。