格拉姆角场 GAF 实战:Python 代码 5 步将时间序列转为图像,适配 CNN 分类

发布时间:2026/7/8 22:54:06

格拉姆角场 GAF 实战:Python 代码 5 步将时间序列转为图像,适配 CNN 分类 格拉姆角场实战5步Python代码实现时间序列到图像的智能转换时间序列数据在金融、医疗、物联网等领域无处不在但传统的分析方法往往难以捕捉其复杂的时空特征。而格拉姆角场Gramian Angular Field, GAF技术为我们打开了一扇新窗——将一维时间序列转化为二维图像让卷积神经网络CNN的图像识别能力得以施展。本文将手把手带您实现从原始数据到GAF图像的完整流程包含数据预处理、极坐标转换和矩阵生成的每个技术细节。1. 环境准备与数据预处理在开始GAF转换前我们需要搭建合适的Python环境并准备好示例数据。推荐使用Anaconda创建虚拟环境conda create -n gaf_env python3.8 conda activate gaf_env pip install numpy matplotlib pyts scikit-learn对于演示数据我们使用模拟的股票价格时间序列。真实场景中这可能是传感器读数、ECG信号或任何时序数据import numpy as np import matplotlib.pyplot as plt # 生成示例时间序列 np.random.seed(42) timestamps np.arange(0, 100) values np.cumsum(np.random.randn(100)) 100 plt.figure(figsize(10,4)) plt.plot(timestamps, values) plt.title(原始时间序列数据) plt.xlabel(时间戳) plt.ylabel(数值) plt.show()关键预处理步骤数据清洗处理缺失值和异常点归一化将值域缩放到[-1, 1]区间降采样使用PAA减少数据量注意归一化是GAF的关键步骤不当的缩放会导致角度计算错误2. 分段聚合近似(PAA)降维长时间序列直接转换会产生超大图像我们先用PAA进行降维from pyts.approximation import PiecewiseAggregateApproximation # 原始数据形状(1, 100) X values.reshape(1, -1) # 设置窗口大小为5将100点降为20点 paa PiecewiseAggregateApproximation(window_size5) X_paa paa.transform(X) # 可视化对比 plt.figure(figsize(10,4)) plt.plot(X[0], o--, label原始数据(100点)) plt.plot(np.arange(2.5, 100, 5), X_paa[0], o-r, labelPAA降维(20点)) plt.legend() plt.title(分段聚合近似(PAA)效果对比) plt.show()PAA参数选择建议窗口大小保留特征计算效率适用场景小(2-5)细节丰富较低高频信号中(5-10)平衡中等一般时序大(10)趋势保留高长期预测3. 极坐标转换时间序列的新视角将缩放后的数据转换为极坐标系是GAF的核心创新from pyts.preprocessing import MinMaxScaler # 缩放到[-1,1]区间 scaler MinMaxScaler(feature_range(-1, 1)) X_scaled scaler.transform(X_paa) # 极坐标转换 phi np.arccos(X_scaled[0]) # 角度 r np.linspace(0, 1, len(phi)) # 半径(时间) # 极坐标可视化 fig plt.figure(figsize(8,8)) ax fig.add_subplot(111, projectionpolar) ax.plot(phi, r, o-) ax.set_title(时间序列的极坐标表示, pad20) plt.show()极坐标转换的数学原理值→角度φ arccos(x), x∈[-1,1]时间→半径r (t - t_min)/(t_max - t_min)技术细节arccos函数在[-1,1]是单调的保证了转换的可逆性4. 生成格拉姆角场矩阵基于极坐标生成两种GAF矩阵def generate_gaf(phi): 生成GASF和GADF矩阵 cos_phi np.cos(phi) sin_phi np.sin(phi) # 格拉姆角和场(GASF) gasf cos_phi.reshape(-1, 1) cos_phi.reshape(1, -1) - sin_phi.reshape(-1, 1) sin_phi.reshape(1, -1) # 格拉姆角差场(GADF) gadf sin_phi.reshape(-1, 1) cos_phi.reshape(1, -1) - cos_phi.reshape(-1, 1) sin_phi.reshape(1, -1) return gasf, gadf gasf, gadf generate_gaf(phi) # 可视化 fig, (ax1, ax2) plt.subplots(1, 2, figsize(12,5)) ax1.imshow(gasf, cmaprainbow) ax1.set_title(GASF矩阵) ax2.imshow(gadf, cmaprainbow) ax2.set_title(GADF矩阵) plt.tight_layout() plt.show()GAF矩阵特性对比特性GASFGADF数学形式cos(φi φj)sin(φi - φj)对角线值cos(2φi)0时间相关性强中等适用场景周期性分析突变检测5. 端到端GAF生成管道将上述步骤封装为可复用的管道from sklearn.pipeline import Pipeline from pyts.preprocessing import MinMaxScaler from pyts.approximation import PiecewiseAggregateApproximation class GramianAngularField: def __init__(self, methodsum): self.method method def transform(self, X): phi np.arccos(X) if self.method sum: return np.cos(phi[:, None] phi[None, :]) else: return np.sin(phi[:, None] - phi[None, :]) # 构建管道 gaf_pipeline Pipeline([ (paa, PiecewiseAggregateApproximation(window_size5)), (scaler, MinMaxScaler(feature_range(-1, 1))), (gaf, GramianAngularField(methodsum)) ]) # 应用管道 X_gasf gaf_pipeline.fit_transform(values.reshape(1, -1)) # 保存结果 plt.imsave(gasf_image.png, X_gasf[0], cmaprainbow)管道优化技巧动态调整PAA窗口大小尝试不同的颜色映射(cm

相关新闻