在时间序列数据分析中,聚类算法是一种强大的工具,它能帮助我们发现隐藏在数据中的模式和结构。K-means算法是其中一种常用的聚类方法。通过一个实例,我们将看到如何使用tslearn
库来执行K-means聚类。
K-means聚类是一种划分方法,旨在将n个观察值划分为k个聚类,每个聚类的中心是该聚类中所有观察值的均值。通过这种方式,我们可以发现时间序列数据中的不同模式。
tslearn
库简介tslearn
是一个用于时间序列机器学习的Python库。它提供了多种用于时间序列聚类和分类的工具和算法。
我们将使用tslearn
库中的一个示例,来展示如何在时间序列数据上执行K-means聚类。具体步骤如下:
import numpy
import matplotlib.pyplot as plt
from tslearn.clustering import TimeSeriesKMeans
from tslearn.datasets import CachedDatasets
from tslearn.preprocessing import TimeSeriesScalerMeanVariance, \
TimeSeriesResampler
seed = 0
numpy.random.seed(seed)
X_train, y_train, X_test, y_test = CachedDatasets().load_dataset("Trace")
X_train = X_train[y_train < 4] # Keep first 3 classes
numpy.random.shuffle(X_train)
# Keep only 50 time series
X_train = TimeSeriesScalerMeanVariance().fit_transform(X_train[:50])
# Make time series shorter
X_train = TimeSeriesResampler(sz=40).fit_transform(X_train)
sz = X_train.shape[1]
# Euclidean k-means 欧几里得K-means
print("Euclidean k-means")
km = TimeSeriesKMeans(n_clusters=3, verbose=True, random_state=seed)
y_pred = km.fit_predict(X_train)
plt.figure()
for yi in range(3):
plt.subplot(3, 3, yi + 1)
for xx in X_train[y_pred == yi]:
plt.plot(xx.ravel(), "k-", alpha=.2)
plt.plot(km.cluster_centers_[yi].ravel(), "r-")
plt.xlim(0, sz)
plt.ylim(-4, 4)
plt.text(0.55, 0.85,'Cluster %d' % (yi + 1),
transform=plt.gca().transAxes)
if yi == 1:
plt.title("Euclidean $k$-means")
# DBA-k-means
print("DBA k-means")
dba_km = TimeSeriesKMeans(n_clusters=3,
n_init=2,
metric="dtw",
verbose=True,
max_iter_barycenter=10,
random_state=seed)
y_pred = dba_km.fit_predict(X_train)
for yi in range(3):
plt.subplot(3, 3, 4 + yi)
for xx in X_train[y_pred == yi]:
plt.plot(xx.ravel(), "k-", alpha=.2)
plt.plot(dba_km.cluster_centers_[yi].ravel(), "r-")
plt.xlim(0, sz)
plt.ylim(-4, 4)
plt.text(0.55, 0.85,'Cluster %d' % (yi + 1),
transform=plt.gca().transAxes)
if yi == 1:
plt.title("DBA $k$-means")
# Soft-DTW-k-means
print("Soft-DTW k-means")
sdtw_km = TimeSeriesKMeans(n_clusters=3,
metric="softdtw",
metric_params={"gamma": .01},
verbose=True,
random_state=seed)
y_pred = sdtw_km.fit_predict(X_train)
for yi in range(3):
plt.subplot(3, 3, 7 + yi)
for xx in X_train[y_pred == yi]:
plt.plot(xx.ravel(), "k-", alpha=.2)
plt.plot(sdtw_km.cluster_centers_[yi].ravel(), "r-")
plt.xlim(0, sz)
plt.ylim(-4, 4)
plt.text(0.55, 0.85,'Cluster %d' % (yi + 1),
transform=plt.gca().transAxes)
if yi == 1:
plt.title("Soft-DTW $k$-means")
plt.tight_layout()
plt.show()
【注】红色线表示每个聚类中心的中心序列,它是该聚类中所有时间序列的代表或平均。通过比较时间序列与中心序列的相似度,算法能够将时间序列分配到相应的聚类中心。在欧几里得k-means中,红色线是通过简单的算术平均来计算的;在DBA k-means中,红色线是通过动态时间规整(DTW)的平均来计算的;在Soft-DTW k-means中,红色线是通过软动态时间规整(Soft-DTW)的平均来计算的。最终的分类是根据每个时间序列与中心序列的相似度来确定的。
该代码是通过tslearn库中的TimeSeriesKMeans类在一个名为“Trace”的时间序列数据集上执行三种不同的K-means聚类算法(欧几里得K-means、DBA-K-means和Soft-DTW-K-means)。首先,它加载并预处理数据,然后分别应用三种K-means聚类算法,并将聚类结果绘制到图中。通过比较三种聚类方法的结果,可以分析各种聚类方法在这个特定数据集上的效果和特点。