0

次のタイプの時系列データをクラスタリングするためのさまざまなオプションを検討しています。

2 つの異なるイベント - たとえば 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 mt で、数百万のポイントがあります

イベントは相関しているため、一連の 2 または 1 が発生する可能性があります。たとえば、小さな断片 (両方のタイプの 100 ~ 200 のイベントを持つ 1 ミリ秒の長さの断片) があります。場合によっては、破棄する必要がある一連のイベント タイプが 1 つだけ発生することがあります。ほとんどの場合、1 つまたはいくつかのイベントが記録されますが、これは単なるノイズです (データの 80% 以上)。

これは明らかに、イベント タイプ情報を含む時系列データです。

クラスタリング手法を適用して、意味のある小さな断片を特定したいと思います。私はMatlabを使用しており、DBSCAN、k-means(アプリオリにクラスターの数がわからないため役に立たない)などのオプションを調べようとしました.

(これらは連続したチャンクであるため、記録時間自体を「距離」と見なすことができます。つまり、 dist(x1,x2) = abs( x2(2) - x1(2) ) if x is (event, time) ;また、たとえば時間 = 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 に答える