- 問題
- 答え
- 解説
Python コード:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from tslearn.clustering import TimeSeriesKMeans np.random.seed(42) data = np.random.rand(15, 50) model = TimeSeriesKMeans( n_clusters=3, metric="dtw", random_state=0) model.fit(data) cent = model.cluster_centers_ for i, cent in enumerate(cent): plt.plot(cent.ravel(), label=f'cluster {i}') plt.legend() plt.show()
回答の選択肢:
(A) 各クラスタの最小値
(B) 各クラスタの平均
(C) 各クラスタの中心との距離
(D) 各クラスタのクラスター番号
正解: (B)
回答の選択肢:
(A) 各クラスタの最小値
(B) 各クラスタの平均
(C) 各クラスタの中心との距離
(D) 各クラスタのクラスター番号
- コードの解説
-
このコードは、時系列データをクラスタリングし、各クラスタの中心をプロットするためのものです。以下に各部分の説明を示します。
import numpy as np import pandas as pd import matplotlib.pyplot as plt from tslearn.clustering import TimeSeriesKMeans np.random.seed(42) data = np.random.rand(15, 50) model = TimeSeriesKMeans( n_clusters=3, metric="dtw", random_state=0) model.fit(data) cent = model.cluster_centers_ for i, cent in enumerate(cent): plt.plot(cent.ravel(), label=f'cluster {i}') plt.legend() plt.show()
詳しく説明します。
乱数生成のシードを設定し、15個の時系列データを生成し、それぞれ50のデータポイントを持たせます。
np.random.seed(42) data = np.random.rand(15, 50)
TimeSeriesKMeans
のインスタンスを作成します。model = TimeSeriesKMeans( n_clusters=3, metric="dtw", random_state=0)
n_clusters=3
は3つのクラスタに分けることを指定し、metric="dtw"
は動的時間伸縮法(DTW)を距離計算に使用することを示しています。random_state=0
は結果の再現性を確保するための乱数シードを設定しています。
モデルをデータに適合させます。
model.fit(data)
各クラスタの中心(セントロイド)を取得します。
cent = model.cluster_centers_
各クラスタの中心をプロットします。
cent.ravel()
は多次元配列を1次元に変換します。for i, cent in enumerate(cent): plt.plot(cent.ravel(), label=f'cluster {i}')
- 動的時間伸縮法 (Dynamic Time Warping, DTW) とは?
-
動的時間伸縮法 (Dynamic Time Warping, DTW) は、時系列データ間の類似性を測定するための手法です。DTWは、2つの時系列データの間の距離を計算する際に、時間軸の伸縮を許可することで、異なる速度で進行するパターンを比較することができます。これにより、例えば、異なる速度で発音された同じ単語の音声データや、異なるペースで行われた同じ動作のセンサーデータなどを効果的に比較することができます。
DTWは、動的計画法を用いて、2つの時系列データの間の最適なマッチングを見つけることで、最小の累積距離を計算します。このプロセスでは、各データポイントがどのようにマッチングされるかを決定するためのコスト行列を構築し、最小コストのパスを見つけます。この最小コストのパスが、2つの時系列データの間のDTW距離となります。
DTWは、音声認識、ジェスチャー認識、異常検知など、さまざまな分野で広く利用されています。特に、時系列データの長さや速度が異なる場合に有効です。
- tslearnを利用したDTWクラスタリングとその結果
-
TimeSeriesKMeans
は、時系列データをクラスタリングするための手法で、tslearn
ライブラリの一部として提供されています。この手法は、時系列データを指定した数のクラスタに分けることができ、動的時間伸縮法(DTW)を用いて距離を計算することが可能です。ライブラリのインポート
from tslearn.clustering import TimeSeriesKMeans
tslearn.clustering
からTimeSeriesKMeans
をインポートします。
データの準備
時系列データをNumPy配列またはPandas DataFrameとして準備します。データは2次元配列で、各行が異なる時系列を表し、各列が異なる時間ステップを表します。
0 1 2 3 4 5 6 \ 0 0.374540 0.950714 0.731994 0.598658 0.156019 0.155995 0.058084 1 0.969585 0.775133 0.939499 0.894827 0.597900 0.921874 0.088493 2 0.031429 0.636410 0.314356 0.508571 0.907566 0.249292 0.410383 3 0.908266 0.239562 0.144895 0.489453 0.985650 0.242055 0.672136 4 0.642032 0.084140 0.161629 0.898554 0.606429 0.009197 0.101472 7 8 9 ... 40 41 42 43 \ 0 0.866176 0.601115 0.708073 ... 0.122038 0.495177 0.034389 0.909320 1 0.195983 0.045227 0.325330 ... 0.119594 0.713245 0.760785 0.561277 2 0.755551 0.228798 0.076980 ... 0.962447 0.251782 0.497249 0.300878 3 0.761620 0.237638 0.728216 ... 0.093103 0.897216 0.900418 0.633101 4 0.663502 0.005062 0.160808 ... 0.940459 0.953929 0.914864 0.370159 44 45 46 47 48 49 0 0.258780 0.662522 0.311711 0.520068 0.546710 0.184854 1 0.770967 0.493796 0.522733 0.427541 0.025419 0.107891 2 0.284840 0.036887 0.609564 0.502679 0.051479 0.278646 3 0.339030 0.349210 0.725956 0.897110 0.887086 0.779876 4 0.015457 0.928319 0.428184 0.966655 0.963620 0.853009 [5 rows x 50 columns]
モデルの定義
TimeSeriesKMeans
クラスを用いてモデルを定義します。model = TimeSeriesKMeans( n_clusters=3, metric="dtw", random_state=0)
主なパラメータには以下があります。
n_clusters
: クラスタの数を指定します。metric
: 距離計算に使用するメトリックを指定します。"dtw"
を指定すると動的時間伸縮法が使用されます。random_state
: 結果の再現性を確保するための乱数シードを設定します。
クラスタリングの実行
fit
またはfit_predict
メソッドを使用して、データをクラスタリングします。fit_predict
は、クラスタリング結果のラベルを返します。model.fit(data)
結果の取得
model.cluster_centers_
: 各クラスタの中心(セントロイド)を取得できます。model.labels_
: 各データポイントがどのクラスタに属するかを示すラベルを取得できます。
クラスタの中心(セントロイド)は、各クラスタの代表的な時系列を示します。これを用いて、各クラスタの特徴を理解することができます。ラベルは、各時系列データがどのクラスタに属するかを示します。これにより、データをグループ化し、各グループの特性を分析することができます。
これらの結果を用いて、時系列データのパターンを分析し、異常検知や予測モデルの構築に役立てることができます。クラスタリング結果を可視化することで、データの理解を深めることも可能です。