#!/usr/bin/env python
# coding: utf-8
# In[1]:
import time # 导入time模块,用于时间相关的操作
import datetime # 导入datetime模块,用于处理日期和时间
import pandas as pd # 导入pandas库,用于数据处理和分析
import numpy as np # 导入numpy库,用于数值计算
import matplotlib.pyplot as plt # 导入matplotlib库,用于绘图
from sampen import sampen2 # 从sampen模块导入sampen2函数,用于计算样本熵
from vmdpy import VMD # 从vmdpy模块导入VMD类,用于进行VMD分解
import tensorflow as tf # 导入tensorflow库,用于构建和训练深度学习模型
from sklearn.cluster import KMeans # 从sklearn.cluster模块导入KMeans类,用于进行K-Means聚类分析
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, mean_absolute_percentage_error # 从sklearn.metrics模块导入回归模型的评估指标
from sklearn.preprocessing import MinMaxScaler # 从sklearn.preprocessing模块导入MinMaxScaler类,用于特征缩放
from tensorflow.keras.models import Sequential # 从tensorflow.keras.models模块导入Sequential类,用于构建序贯模型
from tensorflow.keras.layers import Input, Dense, Activation, Dropout, LSTM, GRU # 从tensorflow.keras.layers模块导入用于构建深度学习模型的各种层
from tensorflow.keras.callbacks import ReduceLROnPlateau, EarlyStopping # 从tensorflow.keras.callbacks模块导入回调函数,用于在训练过程中进行学习率调整和早停
from tensorflow.keras.models import Model
import warnings # 导入warnings模块,用于控制警告信息的显示
warnings.filterwarnings('ignore') # 忽略警告信息
# In[2]:
plt.rcParams['font.sans-serif'] = ['Times New Roman'] # 设置字体为 Times New Roman,用于绘图时显示中文字符
plt.rcParams['axes.unicode_minus'] = False # 解决绘图时负号显示为方块的问题
# In[3]:
#更多模型搜索机器学习之心,支持模型定制
# In[4]:
# 从 '焦作.csv' 文件中读取数据,并只使用第一列和第二列的数据
df_raw_data = pd.read_csv('焦作.csv', usecols=[0, 1])
# 将 'AQI' 列的值转换为 Series,并将 'time' 列作为索引
series_close = pd.Series(df_raw_data['AQI'].values, index=df_raw_data['time'])
# 获取 df_raw_data['AQI'] 列值的后 80% 的数据作为测试数据
test = df_raw_data['AQI'].values[int(len(df_raw_data['AQI'].values) * 0.8):]
# In[5]:
def vmd_decompose(series=None, alpha=2000, tau=0, K=7, DC=0, init=1, tol=1e-7, draw=True):
# 调用 VMD 函数进行分解,得到 VMD 分解后的各个分量、分解后的信号和频率
imfs_vmd, imfs_hat, omega = VMD(series, alpha, tau, K, DC, init, tol)
# 将 VMD 分解得到的各个分量转换为 DataFrame
df_vmd = pd.DataFrame(imfs_vmd.T)
# 为 DataFrame 的列命名为 'imf0', 'imf1', 'imf2', ...
df_vmd.columns = ['imf'+str(i) for i in range(K)]
# 返回 VMD 分解得到的各个分量的 DataFrame
return df_vmd#更多模型搜索机器学习之心,支持模型定制
# In[6]:
def LSTM_model(trainset_shape):
model = Sequential()
model.add(Dense(128, input_shape=(trainset_shape[1],), activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))#更多模型搜索机器学习之心,支持模型定制
model.compile(loss='mse', optimizer='adam')
return model
# In[7]:
def evaluation_model(y_test, y_pred):
# 将 y_test 和 y_pred 转换为一维数组
y_test, y_pred = np.array(y_test).ravel(), np.array(y_pred).ravel()
# 计算 R^2 分数
r2 = r2_score(y_test, y_pred)
# 计算均方根误差(RMSE)
rmse = mean_squared_error(y_test, y_pred, squared=False)
# 计算平均绝对误差(MAE)
mae = mean_absolute_error(y_test, y_pred)
# 计算平均绝对百分比误差(MAPE)
mape = mean_absolute_percentage_error(y_test, y_pred)
# 创建包含评估指标的 DataFrame
df_evaluation = pd.DataFrame({'r2': r2, 'rmse': rmse, 'mae': mae, 'mape': mape}, index=range(1))
# 返回评估结果的 DataFrame
return df_evaluation
# In[8]:
def create_train_test_set(data=None, timestep=30, co_imf_predict_for_fitting=None):
# 检查 data 是否为 DataFrame,如果是,则将数据分为输入特征和目标变量
if isinstance(data, pd.DataFrame):
dataY = data['sum'].values.reshape(-1, 1) # 提取目标变量并转换为二维数组
dataX = data.drop('sum', axis=1, inplace=False) # 提取输入特征
else:
dataY = data.values.reshape(-1, 1) # 将目标变量转换为二维数组
dataX = dataY # 将输入特征设置为目标变量
# 对输入特征进行归一化处理
scalarX = MinMaxScaler(feature_range=(0, 1)) # 创建归一化器对象
dataX = scalarX.fit_transform(dataX) # 对输入特征进行归一化处理
# 如果有 co_imf_predict_for_fitting 参数,对其进行归一化处理
if co_imf_predict_for_fitting is not None:
co_imf_predict_for_fitting = scalarX.transform(co_imf_predict_for_fitting)
# 对目标变量进行归一化处理
scalarY = MinMaxScaler(feature_range=(0, 1)) # 创建归一化器对象
dataY = scalarY.fit_transform(dataY) # 对目标变量进行归一化处理
trainX, trainY = [], []#更多模型搜索机器学习之心,支持模型定制
for i in range(len(dataY) - timestep):
# 构建训练集,每个样本包含 timestep 个时间步的输入特征
trainX.append(np.array(dataX[i:(i + timestep)]))
# 对应的目标变量为 timestep+1 的值
trainY.append(np.array(dataY[i + timestep]))
# 如果有 co_imf_predict_for_fitting 参数,将其插入到训练集的末尾
if co_imf_predict_for_fitting is not None:
if i < (len(dataY) - timestep - len(co_imf_predict_for_fitting)):
trainX[i] = np.insert(trainX[i], timestep, dataX[i + timestep], 0)
else:
trainX[i] = np.insert(trainX[i], timestep, co_imf_predict_for_fitting[i - (len(dataY) - timestep - len(co_imf_predict_for_fitting))], 0)
# 调整数据形状以适应全连接神经网络
trainX = np.array(trainX).reshape((len(trainX), -1))
# 返回训练集的输入特征、目标变量以及目标变量的归一化器
return trainX, np.array(trainY), scalarY#更多模型搜索机器学习之心,支持模型定制
# In[9]:
def LSTM_predict(data=None, predict_duration=len(test), fitting=None):
# 创建训练集和测试集
trainX, trainY, scalarY = create_train_test_set(data, co_imf_predict_for_fitting=fitting)
x_train, x_test = trainX[:-predict_duration], trainX[-predict_duration:]
y_train, y_test = trainY[:-predict_duration], trainY[-predict_duration:]
#更多模型搜索机器学习之心,支持模型定制
# 将训练集和测试集进行形状调整以符合 BP 模型的输入要求
train_X = x_train.reshape((x_train.shape[0], -1))
test_X = x_test.reshape((x_test.shape[0], -1))#更多模型搜索机器学习之心,支持模型定制
# 创建 LSTM 模型
model = LSTM_model(train_X.shape)
# 使用训练集训练模型
history = model.fit(train_X, y_train, epochs=300, batch_size=64, validation_split=0.1, verbose=1, shuffle=True,
callbacks=[EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)])
# 对测试集进行预测
y_test_predict = model.predict(test_X)
# 计算模型评估指标
df_gru_evaluation = evaluation_model(y_test, y_test_predict)
# 对预测结果进行逆归一化处理
y_test_predict = y_test_predict.ravel().reshape(-1, 1)#更多模型搜索机器学习之心,支持模型定制
y_test_predict_result = scalarY.inverse_transform(y_test_predict)
y_test_raw = scalarY.inverse_transform(y_test)#更多模型搜索机器学习之心,支持模型定�

机器学习之心
- 粉丝: 2w+
- 资源: 1144
最新资源
- COMSOL仿真:斜入射圆偏振高斯光照射到衬底上的金纳米线模型.pdf
- COMSOL仿真超表面复现:多级分解通用方法与多物理场耦合有限元模拟.pdf
- COMSOL仿真超表面复现:多级分解通用,涵盖六面体与圆柱体阵列的复现及视频讲解与模型展示.pdf
- Comsol仿真:学习涡旋光与折射的代码与仿真文件指南.pdf
- Comsol仿真等离子体空气反应框架:无模型下40多种气体反应详解.pdf
- COMSOL仿真超表面复现:多级分解通用性,适用于各种形状(六面体阵列与圆柱体阵列).pdf
- Comsol仿真超表面复现:多级分解通用建模思路及多物理场耦合有限元模拟.pdf
- COMSOL仿真纳米孔超表面的手性响应.pdf
- COMSOL仿真金属纳米颗粒超表面的多极分解(电流与极化率两种方式).pdf
- COMSOL仿真计算周期性结构多级分解与论文结果一致性验证.pdf
- COMSOL仿真研究:电力电缆缓冲层故障及仿真建模与说明书分析.pdf
- Comsol仿真石墨烯吸收器案例:文献复线操作步骤.pdf
- COMSOL仿真研究:表面增强拉曼散射的电场分布与材料、形貌影响.pdf
- Comsol光子晶体BIC模式下的超快控制涡旋激光器模型.pdf
- Comsol光子晶体BIC模式:超快控制涡旋激光器及能带与Q因子分析.pdf
- COMSOL光子晶体仿真:平带上的BIC合并调控,包含三维能带与Q因子计算及拟合.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


