#!/usr/bin/env python
# coding: utf-8
# In[1]:
from keras.models import Sequential # 导入Sequential模型,用于构建神经网络模型
from keras.layers import Activation, Dropout, Dense, LSTM # 导入激活函数、Dropout层、全连接层和LSTM层
import tensorflow as tf # 导入TensorFlow库
from sklearn.preprocessing import MinMaxScaler # 导入数据预处理工具MinMaxScaler,用于数据归一化
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score # 导入评估指标
from PyEMD import EEMD # 导入PyEMD库中的EEMD类,用于经验模态分解
import pandas as pd # 导入pandas库,用于数据处理和分析
import numpy as np # 导入NumPy库,用于数值计算
import matplotlib.pyplot as plt # 导入matplotlib库,用于绘图
import warnings # 导入warnings库,用于忽略警告信息
warnings.filterwarnings('ignore') # 忽略警告信息
plt.rcParams['font.sans-serif'] = ['Times New Roman'] # 设置字体为Times New Roman,用于绘图时显示中文字符
plt.rcParams['axes.unicode_minus'] = False # 设置坐标轴显示负号(减号)时不使用unicode编码
#更多模型搜索机器学习之心,支持模型定制
#设置模型参数
LOOK_BACK = 10
SPLIT = 0.8
EPOCHS = 10
BATCH_SIZE = 10
#更多模型搜索机器学习之心,支持模型定制
data = pd.read_csv('焦作.csv', usecols=[1]) # 从名为'焦作.csv'的文件中读取数据,仅使用第2列的数据
#data = pd.read_excel('焦作.xlsx', usecols=[1])#Excel文件用这个
data.columns = ["AQI"] # 将数据框的列名更改为"AQI"
#更多模型搜索机器学习之心,支持模型定制
def get_EEMD_residue(data: pd.DataFrame):#定义EEMD分解函数并画图
data_np = data.to_numpy() # 将DataFrame转换为NumPy数组
eemd = EEMD() # 创建EEMD对象
eemd.eemd(data_np) # 对数据进行经验模态分解
IMFs, residue = eemd.get_imfs_and_residue() # 获取分解得到的各个IMF和残差
nIMFs = IMFs.shape[0] # 获取IMF的数量
# 绘制原始数据、各个IMF和残差的图像
plt.figure(figsize=(18, 18), dpi=100) # 创建一个图形窗口,设置大小为18x18英寸,分辨率为100dpi
plt.subplot(nIMFs + 2, 1, 1) # 创建第一个子图,位置为(nIMFs+2)行、1列中的第1个位置
plt.plot(data, 'r') # 在第一个子图中绘制原始数据,线条颜色为红色
plt.ylabel("AQI") # 设置y轴标签为"AQI"
plt.subplot(nIMFs + 2, 1, nIMFs + 2) # 创建第二个子图,位置为(nIMFs+2)行、1列中的最后一个位置
plt.plot(data.index.to_numpy(), residue) # 在第二个子图中绘制残差数据
plt.ylabel("Residue") # 设置y轴标签为"Residue"
for n in range(nIMFs):
plt.subplot(nIMFs + 2, 1, n + 2) # 创建后续的子图,位置为(nIMFs+2)行、1列中的第(n+2)个位置
plt.plot(data.index.to_numpy(), IMFs[n], 'k') # 在当前子图中绘制第n个IMF数据,线条颜色为黑色
plt.ylabel("eIMF %i" % (n + 1)) # 设置y轴标签为"eIMF n"
plt.locator_params(axis='y', nbins=4) # 设置y轴刻度数量为4个
#更多模型搜索机器学习之心,支持模型定制
plt.tight_layout() # 调整子图布局,使其紧凑显示
plt.show() # 显示绘制的图形
return IMFs, residue, nIMFs # 返回IMFs、残差和IMF数量
def create_dataset(dataset):
dataX, dataY = [], [] # 创建空列表用于存储输入特征和目标变量
for i in range(len(dataset) - LOOK_BACK - 1): # 遍历数据集,从第一个样本开始
look_back_data = dataset[i:(i + LOOK_BACK), 0] # 获取长度为LOOK_BACK的输入特征数据
dataX.append(look_back_data) # 将输入特征添加到dataX列表中
dataY.append(dataset[i + LOOK_BACK, 0]) # 将目标变量添加到dataY列表中
return np.array(dataX), np.array(dataY) # 将dataX和dataY转换为NumPy数组并返回
def LSTM_CNN_CBAM(dataset, layer=128):
dataset = dataset.astype('float64') # 将数据集转换为float64类型
dataset = np.reshape(dataset, (-1, 1)) # 重塑数据集的形状为(-1, 1),将其转换为一列
scaler = MinMaxScaler() # 创建一个MinMaxScaler对象,用于数据归一化
dataset = scaler.fit_transform(dataset) # 对数据集进行归一化操作
train_size = int(len(dataset) * SPLIT) # 计算训练集的大小
test_size = len(dataset) - train_size # 计算测试集的大小
train, test = dataset[:train_size, :], dataset[train_size:, :] # 划分训练集和测试集
#更多模型搜索机器学习之心,支持模型定制
trainX, trainY = create_dataset(train) # 使用create_dataset函数从训练集中创建输入特征和目标变量
testX, testY = create_dataset(test) # 使用create_dataset函数从测试集中创建输入特征和目标变量
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1])) # 重塑训练集输入特征的形状为(样本数, 1, LOOK_BACK)
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1])) # 重塑测试集输入特征的形状为(样本数, 1, LOOK_BACK)
#更多模型搜索机器学习之心,支持模型定制
model = Sequential() # 创建一个Sequential模型
model.add(LSTM(layer, input_shape=(1, LOOK_BACK), activation='tanh', return_sequences=True)) # 添加一个LSTM层
model.add(Dropout(0.2)) # 添加一个Dropout层,用于防止过拟合
model.add(LSTM(32, activation='tanh', return_sequences=False)) # 添加第二个LSTM层
model.add(Dropout(0.2)) # 添加第二个Dropout层
model.add(Dense(1, activation='tanh')) # 添加一个全连接层
model.compile(loss='mse', optimizer='adam', metrics=['accuracy']) # 编译模型
model.fit(trainX, trainY, epochs=EPOCHS, batch_size=BATCH_SIZE, verbose=1, validation_split=0.1) # 在训练集上训练模型
trainPredict = model.predict(trainX) # 对训练集进行预测
testPredict = model.predict(testX) # 对测试集进行预测
trainPredict = scaler.inverse_transform(trainPredict) # 将训练集预测结果反向转换为原始数据范围
trainY = scaler.inverse_transform([trainY]) # 将训练集目标变量反向转换为原始数据范围
testPredict = scaler.inverse_transform(testPredict) # 将测试集预测结果反向转换为原始数据范围
testY = scaler.inverse_transform([testY]) # 将测试集目标变量反向转换为原始数据范围
testing_error = np.sqrt(mean_squared_error(testY[0], testPredict[:, 0])) # 计算测试集的均方根误差(RMSE)
return testPredict, testY, testing_error # 返回测试集的预测结果、目标变量和均方根误差
def run_model(IMFs):#更多模型搜索机器学习之心,支持模型定制
IMF_predict_list = [] # 存储每个IMF的预测结果
error_list = [] # 存储每个IMF的测试误差
for i, IMF in enumerate(IMFs): # 遍历每个IMF
print(f"IMF number {i+1}") # 打印当前处理的IMF序号
IMF_predict, IMF_test, testing_error = LSTM_CNN_CBAM(IMF, layer=128) # 调用LSTM函数进行训练和预测
error_list.append(testing_error) # 将当前IMF的测试误差添加到误差列表中
IMF_predict_list.append(IMF_predict) # 将当前IMF的预测结果添加到预测结果列表中
return IMF_predict_list, error_list # 返回所有IMF的预测结果和测试误差列表
def visualize_results(IMF_predict_list, error_list):
for i, v in enumerate(IMF_predict_list): # 遍历IMF_predict_list
IMF_predict_list[i] = v[:, 0] # 将每个IMF的预测结果的第一列提取出来
#更多模型搜索机器学习之心,支持模型定制
final_predict
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.Python实现EEMD-LSTM时间序列预测(完整源码和数据) anaconda + pycharm + python +Tensorflow 注意事项:保姆级注释,几乎一行一注释,方便小白入门学习! 2.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 3.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 4.作者介绍:某大厂资深算法工程师,从事Matlab、Python算法仿真工作8年;擅长智能优化算法、神经网络预测、信号处理、元胞自动机等多种领域的算法仿真实验,更多仿真源码、数据集定制私信+
资源推荐
资源详情
资源评论
收起资源包目录
EEMD-LSTM.zip (3个子文件)
EEMD-LSTM.py 10KB
焦作.csv 62KB
焦作全.csv 112KB
共 3 条
- 1
资源评论
机器学习之心
- 粉丝: 1w+
- 资源: 669
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 目标跟踪-基于目标中心点同时进行目标检测+目标跟踪算法实现-项目源码-优质项目实战.zip
- Python《文本特征分析-全唐诗数据挖掘及分析 》+源代码
- Netron-Setup-4.5.0
- 可编辑的地图图形3-世界、各洲、美国地图.xls
- NineAi 新版ChatGPT AI系统网站源码
- Anaconda3-2022.10windows版本
- 基于Servlet的URL访问安全控制.doc
- 可编辑的地图图形-2-中国到省、到市、到县地图.xls
- 快慢指针法判断链表是否有环-go语言实现
- Python《金融新闻数据挖掘分析 (数据抓取、NLP算法分析、量化策略、回测框架等)》+源代码+项目说明
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功