【问题标题】:Clustering a sequence with time stamps (a time series data of two events)用时间戳对序列进行聚类(两个事件的时间序列数据)
【发布时间】:2013-07-09 22:06:48
【问题描述】:

一直在探索对时间序列数据进行聚类的不同选项:

两个不同的事件 - 比如 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 mts,有数百万个点

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

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

我想应用聚类方法来识别有意义的小片段。我正在使用 Matlab 并尝试研究诸如 DBSCAN、k-means 之类的选项(因为我不知道先验聚类的数量,所以没用)等,

(记录时间本身可以被视为“距离”,因为它们是连续的块。即,dist(x1,x2) = abs(x2(2) - x1(2)) 如果 x 是(事件,时间) ; 此外,在时间 = 10.2 到 10.23 秒之间发生的一系列有意义的事件与任何其他片段都没有关系。即,聚类仅用于“识别”短片段(预计在整个数据集中只有几 10000 个)

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

【问题讨论】:

  • 你看过clusterdata()吗?
  • 是的。由于庞大的数据集导致内存不足,尽管我可以迭代更小的长度)。但我不确定如何只提取我想要的相关部分。
  • 您是否尝试过 savememory 选项?另外,请详细说明“有意义的事件顺序”;从 cmets 到 Hugh 的回答,您似乎只根据时间戳进行区分,这已经降低了问题的维度,即仅集群时间。
  • 是的,对于整个集合,即使使用 savememory 选项,它也会耗尽内存(可以理解)。这不是主要问题,因为我可以分析较长时间序列的较短片段。
  • 理想情况下,有意义的片段的定义包括时间戳和事件类型。一件好的作品将有两个事件的比例,并且事件会在很短的时间间隔内发生。录音中有很多需要过滤的噪音。关于噪声的一些观察结果是:可能有痕迹,其中大多数只有 1 个事件在快速间隔内也发生(如良好的数据)。这种嘈杂的轨迹也可能在一个好的轨迹内,也可能只有几个点(例如,200 点的好轨迹中有 10 个嘈杂的点)。因此,将发生在时间上的事件类型聚集在一起的想法。

标签: matlab time-series cluster-analysis


【解决方案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

【讨论】:

  • 谢谢休,这实际上是我一直在做的。抱歉没有提到它。由于有意义的事件发生在比大多数噪声更短的时间间隔内(一个时间段内的事件阈值数 & dtimes
  • 你如何定义有意义的?这才是问题的根源!
  • 混合了两种事件的片段,不会太长或太短(~300us - 1ms)。
  • OK 参见上面的编辑 - 如果集群中没有事件值等于 1,或者如果集群中的所有事件值都等于 1,或者如果集群中最后一个减去第一个时间点小于时间阈值,将聚类值设置为 -1。根据您的标准,任何超过零的聚类值都是有意义的。根据上述情况,您应该可以轻松添加第二个“太长”时间阈值。
  • 休,刚刚编辑了上面有条件indices=find(assign_clusters==v);indices=find(assign_clusters==current_cluster) 的文章
【解决方案2】:

您可能正在寻找错误的域。

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

你真的应该看看经典的统计方法用于序列,例如核密度估计、自然间断优化等。

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

【讨论】:

  • 感谢KDE等统计方法的参考。遇到过但没用过。比上面简单的基于“时间”的过滤效果如何?有没有具体的代码示例。
  • KDE 更加健壮,并且被广泛接受,并有丰富的理论支持。
猜你喜欢
  • 2015-04-02
  • 2018-01-18
  • 2019-10-22
  • 2017-09-29
  • 2017-09-12
  • 2015-07-22
  • 2021-11-21
  • 2020-09-23
相关资源
最近更新 更多