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 mts,有数百万个点

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

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

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

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

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

4

2 回答 2

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
于 2013-07-11T15:02:40.633 回答
0

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

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

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

例如,您可以使用核密度估计器估计事件 1 和事件 2 的密度,然后在事件 1 或事件 2 的密度比另一个高出某个阈值时拆分数据集。一旦计算了 KDE 曲线,它实际上非常简单。

于 2013-07-12T17:32:20.047 回答