洛伦兹数据集:复杂时间序列聚类分析工具

需积分: 42 12 下载量 108 浏览量 更新于2024-11-16 1 收藏 19.71MB ZIP 举报
资源摘要信息:"洛伦兹数据集是一组专用于测试概率预测能力的复杂数据集。它由多个时间序列组成,这些时间序列是根据洛伦兹系统生成的,该系统由美国数学家爱德华·洛伦兹(Edward Lorenz)提出,用以模拟大气对流现象。洛伦兹系统是一组非线性微分方程,通常被称为洛伦兹方程,用以描述大气对流中流体运动的三个关键变量:x(代表大气对流强度)、y(代表水平温度变化)、z(代表垂直温度变化),它们均是时间t的函数。 在数据集的背景下,每个时间序列代表了一个独立的集群,其中的数据点是由洛伦兹方程在不同初始条件或参数设置下生成的。这种数据的生成过程模拟了自然界中的复杂动态系统,因此这些时间序列具有一定的相似性但也具有复杂性,非常适合用于研究和验证概率预测模型、时间序列分析方法以及机器学习算法在处理非线性和混沌系统上的能力。 洛伦兹数据集可以被用作教育和研究工具,以帮助研究人员和学生理解混沌理论、非线性动力学以及预测模型的构建。因为洛伦兹方程及产生的数据集能够很好地展示混沌现象,即初始条件的微小变化会导致长期的巨大差异,这在气象学、物理学、生物学、经济学以及计算机科学等多个领域都有广泛的应用。 此数据集可能包含以下文件和信息: - 时间序列数据文件,每个文件包含一组特定参数的洛伦兹方程生成的时间窗口数据。 - 可能还包括数据集的元数据,描述每个数据集的生成参数、时间窗口的大小和分辨率等信息。 - 用于验证预测模型性能的基准测试结果或性能指标。 使用洛伦兹数据集的人员可能需要具备一定的数据处理能力和科学计算背景,特别是熟悉Python等编程语言和相关库,如NumPy、pandas、scikit-learn,以及可能用于深度学习的TensorFlow或PyTorch。使用这些库和工具能够帮助研究者高效地加载数据、进行数据预处理、建立和训练预测模型,并评估模型的性能。 在实际应用中,洛伦兹数据集能够检验模型在以下方面的表现: - 预测未来时间点的数据点(时间序列预测)。 - 识别和分类不同的时间序列集群(聚类分析)。 - 揭示和可视化数据中的潜在模式(模式识别与数据可视化)。 - 通过模型比较和基准测试评估预测方法的优越性。 洛伦兹数据集的下载和使用可能需要一定的计算机资源和知识,但是它提供了一个很好的机会来实践和研究概率预测和时间序列分析的最新技术。"

import numpy as np import matplotlib.pyplot as plt import pickle as pkl import pandas as pd import tensorflow.keras from tensorflow.keras.models import Sequential, Model, load_model from tensorflow.keras.layers import LSTM, GRU, Dense, RepeatVector, TimeDistributed, Input, BatchNormalization, \ multiply, concatenate, Flatten, Activation, dot from sklearn.metrics import mean_squared_error,mean_absolute_error from tensorflow.keras.optimizers import Adam from tensorflow.python.keras.utils.vis_utils import plot_model from tensorflow.keras.callbacks import EarlyStopping from keras.callbacks import ReduceLROnPlateau df = pd.read_csv('lorenz.csv') signal = df['signal'].values.reshape(-1, 1) x_train_max = 128 signal_normalize = np.divide(signal, x_train_max) def truncate(x, train_len=100): in_, out_, lbl = [], [], [] for i in range(len(x) - train_len): in_.append(x[i:(i + train_len)].tolist()) out_.append(x[i + train_len]) lbl.append(i) return np.array(in_), np.array(out_), np.array(lbl) X_in, X_out, lbl = truncate(signal_normalize, train_len=50) X_input_train = X_in[np.where(lbl <= 9500)] X_output_train = X_out[np.where(lbl <= 9500)] X_input_test = X_in[np.where(lbl > 9500)] X_output_test = X_out[np.where(lbl > 9500)] # Load model model = load_model("model_forecasting_seq2seq_lstm_lorenz.h5") opt = Adam(lr=1e-5, clipnorm=1) model.compile(loss='mean_squared_error', optimizer=opt, metrics=['mae']) #plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True) # Train model early_stop = EarlyStopping(monitor='val_loss', patience=20, verbose=1, mode='min', restore_best_weights=True) #reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=9, verbose=1, mode='min', min_lr=1e-5) #history = model.fit(X_train, y_train, epochs=500, batch_size=128, validation_data=(X_test, y_test),callbacks=[early_stop]) #model.save("lstm_model_lorenz.h5") # 对测试集进行预测 train_pred = model.predict(X_input_train[:, :, :]) * x_train_max test_pred = model.predict(X_input_test[:, :, :]) * x_train_max train_true = X_output_train[:, :] * x_train_max test_true = X_output_test[:, :] * x_train_max # 计算预测指标 ith_timestep = 10 # Specify the number of recursive prediction steps # List to store the predicted steps pred_len =2 predicted_steps = [] for i in range(X_output_test.shape[0]-pred_len+1): YPred =[],temdata = X_input_test[i,:] for j in range(pred_len): Ypred.append (model.predict(temdata)) temdata = [X_input_test[i,j+1:-1],YPred] # Convert the predicted steps into numpy array predicted_steps = np.array(predicted_steps) # Plot the predicted steps #plt.plot(X_output_test[0:ith_timestep], label='True') plt.plot(predicted_steps, label='Predicted') plt.legend() plt.show()

2023-06-12 上传