时间序列聚类

这篇具有很好参考价值的文章主要介绍了时间序列聚类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

时间序列聚类概述

时间序列相识度衡量

动态时间规整

​编辑

欧式距离

子序列聚类

​编辑 

时间点聚类

基于时间序列形状Kshpe聚类

基于分段统计特征聚类

时间序列聚类概述

时间序列聚类:一种将时间序列数据分为不同组的无监督学习方法。聚类方法旨在找到数据中相似的子集,并将它们归为同一组。对于时间序列数据而言,聚类技术可以发现有相似特征的序列,并将它们划分为同一组,这有助于数据的分类和分析。

时间序列聚类包括两种类型:子序列聚类和时间点聚类。子序列聚类是通过滑动窗口在一个时间序列中提取的一系列子序列上的聚类;时间点聚类基于时间点的时间接近度和对应值的相似性组合的聚类。时间序列聚类通常使用常见的聚类算法,如K-means、Ksahpe 、层次聚类等。

时间序列相识度衡量

动态时间规整

动态时间规整(Dynamic Time Warping,DTW)是一种解决时间序列相似度匹配问题的非常有效的方法。它可以在不同长度和速度的时间序列之间计算距离。

DTW 算法的核心思想是对两个时间序列进行对齐,并计算两个序列之间每个点之间的距离。在对齐的过程中,DTW 可以进行拉伸或压缩时间轴,使得两个序列之间的对应点能够匹配上。因此,DTW 可以处理不同长度和采样率的时间序列数据。

DTW 算法的步骤如下:

  1. 初始化一个距离矩阵,该矩阵为两个时间序列的长度的二维矩阵。
  2. 进行动态规划,按照规定的路径更新距离矩阵,从而找到最优的对齐方案。
  3. 计算两个序列之间的距离,该距离就是对齐后的时间序列之间点之间的距离。
from scipy.spatial.distance import euclidean
from fastdtw import fastdtw

# 定义两个时间序列
x = [1, 2, 3, 4, 5]
y = [1, 2, 2, 4, 4, 5]

# 使用快速DTW算法进行动态时间规整并计算距离
distance, path = fastdtw(x, y, dist=euclidean)

# 打印计算出的距离和对齐路径
print("Distance: ", distance)
print("Path: ", path)

时间序列聚类,机器学习,聚类,机器学习,算法

欧式距离

对时间序列数据多标量统计特征,如日、月、年的均值、方差、中位数、峰值、偏度等,用欧式距离衡量其相似度;

子序列聚类

时间序列子序列聚类(Subsequence Clustering)是一种将时间序列数据按相似性分为不同组的无监督学习方法。与传统时间序列聚类不同,子序列聚类算法不是将整个时间序列进行聚类,而是基于一些已知的子序列特征来进行子序列聚类。

代码中定义了样本数、时间步长和特征维度,并生成了随机时间序列数据。接着,我们定义了子序列长度和步长,使用 extract_subsequences() 函数从原始时间序列数据中提取出子序列数据。然后,我们定义了聚类数目为 3,使用 k-means 算法对子序列数据进行聚类,并获取每个样本所属的类别。最后,我们打印输出了每个类别的样本数量;

import numpy as np
from sklearn.cluster import KMeans

def extract_subsequences(X, subseq_len, stride):
    n_samples, n_timesteps, n_features = X.shape
    subsequences = []
    for i in range(n_samples):
        for j in range(0, n_timesteps - subseq_len + 1, stride):
            subseq = X[i, j:j+subseq_len, :]
            subsequences.append(subseq.ravel())
    return np.array(subsequences)

# 定义样本数、时间步长和特征维度
n_samples, n_timesteps, n_features = 100, 40, 5

# 生成随机时间序列数据
X = np.random.rand(n_samples, n_timesteps, n_features)

# 获取子序列数据
subseq_len, stride = 10, 5
X_subseq = extract_subsequences(X, subseq_len=subseq_len, stride=stride)

# 定义聚类数目
n_clusters = 3

# 使用 k-means 算法对数据进行聚类
kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(X_subseq)

# 获取每个样本所属的类别
labels = kmeans.labels_

# 打印每个类别的样本数量
unique, counts = np.unique(labels, return_counts=True)
print(dict(zip(unique, counts)))

时间序列聚类,机器学习,聚类,机器学习,算法

时间点聚类

基于时间序列形状Kshpe聚类

KShape是一种时间序列聚类算法,它可以将时间序列数据分成不同的簇(cluster),使得同一簇内的数据对象的相似度尽可能大。KShape使用了形状距离(Shape distance)来衡量两个时间序列之间的相似度,同时还使用了动态规划(Dynamic Programming)来对每个时间序列进行对齐操作(alignment),以便更准确地计算形状距离。KShape的主要参数包括簇数目(n_clusters)、最大迭代次数(max_iter)和阈值(tol),用户可以根据实际情况进行设置。KShape聚类算法需要先加载tslearn库并调用tslearn.clustering.KShape类。

下面提供了两种基于形状聚类的代码

import numpy as np
import matplotlib.pyplot as plt
from tslearn.datasets import CachedDatasets
from tslearn.preprocessing import TimeSeriesScalerMeanVariance
from tslearn.piecewise import SymbolicAggregateApproximation
from tslearn.clustering import TimeSeriesKMeans

# 加载数据集并对时间序列进行预处理
X_train, y_train, _, _ = CachedDatasets().load_dataset("Trace")
X_train = TimeSeriesScalerMeanVariance().fit_transform(X_train[:6])
X_train = SymbolicAggregateApproximation(n_segments=10, alphabet_size_avg=2).fit_transform(X_train)

# 定义并训练KMeans聚类器
km = TimeSeriesKMeans(n_clusters=3, verbose=True, random_state=42)
y_pred = km.fit_predict(X_train)

# 可视化聚类结果
plt.figure(figsize=(10, 10))
for yi in range(3):
    plt.subplot(3, 1, 1 + yi)
    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, X_train.shape[1])
    plt.ylim(-4, 4)
    plt.title("Cluster %d" % (yi + 1))

plt.tight_layout()
plt.show()
from tslearn.clustering import KShape
from tslearn.generators import random_walks
from sklearn_extra.cluster import KMedoids
import tslearn.metrics as metrics
from tslearn.clustering import silhouette_score
from tslearn.generators import random_walks
# X:需要训练的时间序列矩阵

#定义分成6类
num_cluster = 6

# precomputed自定义相似度计算方法
km = KMedoids(n_clusters= num_cluster, random_state=0,metric="precomputed")

 # 采用tslearn中的DTW系列及变种算法计算相似度,生成距离矩阵dists
# dists = metrics.cdist_dtw(X) # dba + dtw
dists = metrics.cdist_soft_dtw_normalized(X,gamma=0.5) # softdtw

#预测结果
y_pred = km.fit_predict(dists)

# 计算轮廓系数
np.fill_diagonal(dists,0)
score = silhouette_score(dists,y_pred,metric="precomputed")

print(X.shape)
print(y_pred.shape)
print("silhouette_score: " + str(score)

基于分段统计特征聚类

时间序列统计特征:

  1. 基于整个时间序列统计特征有最大值、最小值、均值、方差、偏度、峰度、熵;
  2. 可以时间序列进行分段,如周、月、年或者自定义分段参数,统计最大值、最小值、均值、方差、偏度、峰度、熵等特征;
  3. 基于tsfresh时间特征提取特征;
  4. 基于1,2,3方法选取合适特征,再采用Kmeans、层次聚类、密度聚类等方法聚类;

时间序列计算峰度代码

import pandas as pd

# 读取时间序列数据,要求数据第一列为时间,第二列为数值
data = pd.read_csv('time_series.csv', parse_dates=['time'], index_col='time')

# 计算时间序列峰度
kurtosis = data.kurtosis()[0]

print("该时间序列的峰度为:", kurtosis)

时间序列计算偏度代码

import pandas as pd

# 读取时间序列数据,要求数据第一列为时间,第二列为数值
data = pd.read_csv('time_series.csv', parse_dates=['time'], index_col='time')

# 计算时间序列偏度
skewness = data.skew()[0]

print("该时间序列的偏度为:", skewness)

时间序列计算

t1 =[1,3,1,3,1,3,1,3]

t2 =[1,3,3,1,1,1,3,3]

t1,t2两个序列是不一样的,t1是有规律的,t2相对无序,想描述这种确定与不确定性。可用熵来表示;以下是计算时间序列熵的代码;

from pyentrp import entropy as ent

# 读取时间序列数据,要求数据第一列为时间,第二列为数值
data = pd.read_csv('time_series.csv', parse_dates=['time'], index_col='time')

# 将时间序列转化为一维数组,并计算其熵
ts = data['value'].values
entropy = ent.shannon_entropy(ts)
print("该时间序列的熵为:", entropy)

tsfresh 可以自动计算大量的时间序列特性,包含许多特征提取方法和强大的特征选择算法。

# 时间序列特征提取
from tsfresh import extract_features, extract_relevant_features, select_features
from tsfresh.feature_extraction import extract_features, EfficientFCParameters
from tsfresh.utilities.dataframe_functions import impute
from tsfresh.feature_extraction import ComprehensiveFCParameters


# extraction_settings = EfficientFCParameters()#计算算所有默认特征和带参数的特征的多种参数组合
extraction_settings = ComprehensiveFCParameters()

X = extract_features(data, column_id="id", column_sort='time',
                     default_fc_parameters=extraction_settings,
                     # impute就是自动移除所有NaN的特征
                     impute_function=impute)
X.head()

时间序列聚类,机器学习,聚类,机器学习,算法

Kmeans聚类

 提供一个Kmeans选取k值函数文章来源地址https://www.toymoban.com/news/detail-707635.html

from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans
from sklearn import preprocessing

# Kmeans选取k值函数

def get_silhouette_K(data, range_K):
    K = range(2, range_K)
    Scores = [] 
    for k in K:
        kmeans = KMeans(n_clusters=k)
        kmeans.fit(data)
        Scores.append(silhouette_score(data, kmeans.labels_, metric='euclidean'))

    max_idx = Scores.index(max(Scores))
    best_k = K[max_idx]
    plt.plot(K, Scores, 'bx-')
    plt.xlabel('k')
    plt.ylabel('silhouette')
    plt.title('Selecting k with the silhouette Method')
    plt.show()
    return best_k

到了这里,关于时间序列聚类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习多步时间序列预测解决方案

    近年来,随着机器学习与深度学习的发展机器学习平台的成熟,数据科学家们不再需要关心底层的基础设施及构建复杂的训练与推理环境,从而可以把主要的时间与精力放在数据与算法本身。在机器学习变得更容易的今天,越来越多的传统行业已经开始使用机器学习算法来解

    2024年02月10日
    浏览(38)
  • 【关于时间序列的ML】项目 5 :用机器学习预测天气

      🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】 ​​  🖍foreword

    2023年04月21日
    浏览(28)
  • 使用轮廓分数提升时间序列聚类的表现

    我们将使用轮廓分数和一些距离指标来执行时间序列聚类实验,并且进行可视化 让我们看看下面的时间序列: 如果沿着y轴移动序列添加随机噪声,并随机化这些序列,那么它们几乎无法分辨,如下图所示-现在很难将时间序列列分组为簇: 上面的图表是使用以下脚本创建的: 现

    2024年02月07日
    浏览(24)
  • 深度学习和机器学习中针对非时间序列的回归任务,有哪些改进角度?

    在非时间序列的回归任务中,深度学习和机器学习都是常用的方法。为了进一步提升模型的性能,可以通过改进数据处理、数据增强、特征选择、模型选择、模型正则化与泛化、优化器、学习率、超参数调优等方面,来提升模型的性能和可解释性。 提高数据质量和进行恰当的

    2024年01月19日
    浏览(34)
  • 【关于时间序列的ML】项目 3 :基于机器学习的地震预测模型

      🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏 - 机器学习【ML】 自然语言处理【NLP】  深度学习【DL】 ​​  🖍foreword

    2024年02月02日
    浏览(30)
  • 当机器人变硬核:探索深度学习中的时间序列预测

      收藏自:Wed, 15 Sep 2021 10:32:56 UTC 摘要:时间序列预测是机器学习和深度学习领域的一个重要应用,它可以用于预测未来趋势、分析数据模式和做出决策。本文将介绍一些基本概念和常用方法,并结合具体的案例,展示如何使用深度学习模型实现时间序列预测。 文章内容:

    2024年02月12日
    浏览(30)
  • Python用 tslearn 进行时间序列聚类可视化

    我们最近在完成一些时间序列聚类任务,偶然发现了 tslearn 库。我很想看看启动和运行 tslearn 已内置的聚类有多简单,结果发现非常简单直接 ( 点击文末“阅读原文”获取完整 代码数据 )。 相关视频 首先,让我们导入我们需要的库: netdata_pandas 用于提取一些时间序列数据

    2024年02月11日
    浏览(27)
  • 时间序列预测模型实战案例(四)(Xgboost)(Python)(机器学习)图解机制原理实现时间序列预测和分类(附一键运行代码资源下载和代码讲解)

    目录图解机制原理 简介 Xgboost预测精度 实验一(回归) 实验二(分类) Xgboost的数学机制原理 图解Xgboost运行机制原理  决策树 决策树结构图 Xgboost Xgboost的机制原理 贪心算法 Xgboost总结 数据格式需求 Xgboost运行代码 Xgboost时间序列预测及代码 Xgboost分类任务及代码 Xgboost运行资源下

    2024年02月03日
    浏览(60)
  • 数据分享|R语言分析上海空气质量指数数据:kmean聚类、层次聚类、时间序列分析:arima模型、指数平滑法...

    最近我们被客户要求撰写关于上海空气质量指数的研究报告。本文向大家介绍R语言对上海PM2.5等空气质量数据 ( 查看文末了解数据免费获取方式 ) 间的相关分析和预测分析,主要内容包括其使用实例,具有一定的参考价值,需要的朋友可以参考一下 ( 点击文末“阅读原文

    2024年02月09日
    浏览(44)
  • 机器学习——时间序列ARIMA模型(三):AR、MA、ARMA、ARIMA模型定义及公式介绍及股价预测案例代码

    使用自身的数据进行预测,且只适用于预测与自身前期相关的现象。 注意:需满足具有平稳性的要求,需满足自相关性,自相关系数需大于0.5。 p阶自回归公式: y t = μ + ∑ i = 1 p γ i y t − i + e t y_{t}=μ+sum_{i=1}^pgamma_{i}y_{t-i}+e_{t} y t ​ = μ + i = 1 ∑ p ​ γ i ​ y t − i ​ + e

    2024年02月02日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包