web-dev-qa-db-ja.com

時系列データに対してK-meansクラスタリングを実行するにはどうすればよいですか?

時系列データのK-meansクラスタリングを行うにはどうすればよいですか?入力データがポイントのセットである場合にこれがどのように機能するかは理解していますが、Mがデータ長である1XMで時系列をクラスター化する方法がわかりません。特に、時系列データのクラスターの平均を更新する方法がわかりません。

ラベル付けされた時系列のセットがあり、K-meansアルゴリズムを使用して、同様のラベルが返されるかどうかを確認したいと思います。私のX行列はNX Mになります。ここで、Nは時系列の数、Mは上記のデータ長です。

誰かがこれを行う方法を知っていますか?たとえば、時系列データで機能するように このk-はMATLABコードを意味します を変更するにはどうすればよいですか?また、ユークリッド距離以外にもさまざまな距離メトリックを使用できるようにしたいと思います。

私の疑問をよりよく説明するために、時系列データ用に変更したコードを次に示します。


% Check if second input is centroids
if ~isscalar(k) 
    c=k;
    k=size(c,1);
else
    c=X(ceil(Rand(k,1)*n),:); % assign centroid randomly at start
end

% allocating variables
g0=ones(n,1); 
gIdx=zeros(n,1);
D=zeros(n,k);

% Main loop converge if previous partition is the same as current
while any(g0~=gIdx)
%     disp(sum(g0~=gIdx))
    g0=gIdx;
    % Loop for each centroid
    for t=1:k
        %  d=zeros(n,1);
        % Loop for each dimension
        for s=1:n
            D(s,t) = sqrt(sum((X(s,:)-c(t,:)).^2)); 
        end
    end
    % Partition data to closest centroids
    [z,gIdx]=min(D,[],2);
    % Update centroids using means of partitions
    for t=1:k

        % Is this how we calculate new mean of the time series?
        c(t,:)=mean(X(gIdx==t,:));

    end
end
19
Jaz

時系列は通常、高次元です。また、類似性を比較するには、特殊な距離関数が必要です。さらに、外れ値がある可能性があります。

k-meansは、(意味のある)ユークリッド距離を持つ低次元空間用に設計されています。外れ値に二乗の重みがかかるため、外れ値に対してあまり堅牢ではありません。

時系列データでk-meansを使用することは、私には良い考えとは思えません。より現代的で堅牢なクラスタリングアルゴリズムを調べてみてください。多くの場合、DTWなどの時系列距離を含む任意の距離関数を使用できます。

6
Anony-Mousse

おそらく答えるには遅すぎますが、:

上記のメソッドはRを使用します。たとえば、「 時系列の反復型インクリメンタルクラスタリング "」を探すと、さらに多くのメソッドが見つかります。

3
Fr.

私は最近、縦断的データのk-meansクラスタリングを実装すると主張する kml Rパッケージに出くわしました。自分で試したことはありません。

また、 時系列クラスタリング-10年のレビュー S。Aghabozorgi、A。S。Shirkhorshidi、T。YingWahによる論文は、代替案を探すのに役立つかもしれません。もう1つの素晴らしい論文は、多少古くなっていますが、 時系列データのクラスタリング-調査 T. WarrenLiaoによるものです。

2
DimP

本当にクラスタリングを使用したい場合は、アプリケーションに応じて、時系列ごとに低次元の特徴ベクトルを生成できます。たとえば、時系列平均、標準偏差、フーリエ変換からの支配的な頻度などを使用します。これはk-meansでの使用に適していますが、有用な結果が得られるかどうかは、特定のアプリケーションと時間の内容によって異なります。シリーズ。

1

K-meansも正しい方法ではないと思います。 @ Anony-Mousseが提案したように、 [〜#〜] dtw [〜#〜] を利用できます。実際、私は自分のプロジェクトの1つで同じ問題を抱えていて、そのための独自のクラスをPythonで作成しました。論理は次のとおりです。

  1. すべてのクラスターの組み合わせを作成します。 kはクラスター数、nは系列数です。返されるアイテムの数はn! / k! / (n-k)!である必要があります。これらは潜在的なセンターのようなものになります。
  2. シリーズごとに、各クラスターグループの各中心の距離を計算し、最小の中心に割り当てます。
  3. 各クラスターグループについて、個々のクラスター内の合計距離を計算します。
  4. 最小値を選択してください。

そして、興味があれば、Python実装は ここ です。

0
Dogan Askan