时序数据分类——基于tslearn库下不同尺度的k-means算法

在时间序列数据分析中,聚类算法是一种强大的工具,它能帮助我们发现隐藏在数据中的模式和结构。K-means算法是其中一种常用的聚类方法。通过一个实例,我们将看到如何使用tslearn库来执行K-means聚类。

什么是K-means聚类?

K-means聚类是一种划分方法,旨在将n个观察值划分为k个聚类,每个聚类的中心是该聚类中所有观察值的均值。通过这种方式,我们可以发现时间序列数据中的不同模式。

tslearn库简介

tslearn是一个用于时间序列机器学习的Python库。它提供了多种用于时间序列聚类和分类的工具和算法。

K-means聚类实例

我们将使用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()

结果展示:


时序数据分类——基于tslearn库下不同尺度的k-means算法_第1张图片

【注】红色线表示每个聚类中心的中心序列,它是该聚类中所有时间序列的代表或平均。通过比较时间序列与中心序列的相似度,算法能够将时间序列分配到相应的聚类中心。在欧几里得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聚类算法,并将聚类结果绘制到图中。通过比较三种聚类方法的结果,可以分析各种聚类方法在这个特定数据集上的效果和特点。

你可能感兴趣的:(分类,kmeans,数据挖掘)