#!/usr/bin/env python
# coding: utf-8
# In[1]:
import math # 导入math模块,用于数学运算
import os # 导入os模块,用于操作系统相关功能
import random # 导入random模块,用于生成随机数
import tensorflow as tf # 导入tensorflow模块,用于机器学习和深度学习
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块,用于绘图
import numpy as np # 导入numpy模块,用于科学计算
import pandas as pd # 导入pandas模块,用于数据处理
from sklearn.metrics import mean_squared_error # 从sklearn.metrics模块导入mean_squared_error函数,用于计算均方误差
from sklearn.metrics import mean_absolute_error # 从sklearn.metrics模块导入mean_absolute_error函数,用于计算平均绝对误差
from sklearn.metrics import r2_score # 从sklearn.metrics模块导入r2_score函数,用于计算R平方值
from sklearn.preprocessing import MinMaxScaler # 从sklearn.preprocessing模块导入MinMaxScaler类,用于特征缩放
from tensorflow.python.keras.callbacks import EarlyStopping # 从tensorflow.python.keras.callbacks模块导入EarlyStopping类,用于提前停止训练
from tensorflow.python.keras.layers import Dense, Dropout, LSTM # 从tensorflow.python.keras.layers模块导入Dense、Dropout、LSTM类,用于构建神经网络层
from tensorflow.python.keras.layers.core import Activation # 从tensorflow.python.keras.layers.core模块导入Activation类,用于激活函数
from tensorflow.python.keras.models import Sequential # 从tensorflow.python.keras.models模块导入Sequential类,用于构建序贯模型
import numpy # 导入numpy模块,用于科学计算
import time # 导入time模块,用于时间相关操作
# In[2]:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# In[3]:
# 调用GPU加速
gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
# In[4]:
'''
定义一个函数用于创建数据集,输入参数包括:
dataset: 数据集
look_back: 回溯长度,即用多少个时间步作为输入预测下一个时间步
'''
def creat_dataset(dataset, look_back):
dataX, dataY = [], []
for i in range(len(dataset) - look_back - 1):# 循环遍历数据集
a = dataset[i: (i + look_back)]# 提取回溯长度的数据作为输入
dataX.append(a)# 将该输入数据添加到输入数据集
dataY.append(dataset[i + look_back])# 将下一个时间步的数据添加到输出数据集
return np.array(dataX), np.array(dataY)# 将输入输出数据集转换为numpy数组并返回
# In[5]:
dataframe = pd.read_csv('焦作.csv',header=0, parse_dates=[0],index_col=0, usecols=[0, 1])# 读取CSV文件,并设置第一列为日期,作为索引
dataset = dataframe.values# 获取数据集的值
dataframe.head(10)# 查看前10行数据
# In[6]:
scaler = MinMaxScaler(feature_range=(0, 1))# 使用 MinMaxScaler 进行数据归一化
dataset = scaler.fit_transform(dataset.reshape(-1, 1))# 将数据变为二维数组并进行归一化
# In[7]:
train_size = int(len(dataset) * 0.8) # 计算训练集大小,将数据集长度的 80% 转换为整数
test_size = len(dataset) - train_size # 计算测试集大小,将剩余的数据作为测试集
train, test = dataset[0: train_size], dataset[train_size: len(dataset)] # 将数据集划分为训练集和测试集,使用切片操作实现
# In[8]:
def build_model(lk, neurons1, neurons2, neurons3, dropout):
look_back = lk # 设置滑动窗口的大小为look_back
trainX, trainY = creat_dataset(train, look_back) # 根据训练集数据和滑动窗口大小创建训练集的输入序列和输出值
testX, testY = creat_dataset(test, look_back) # 根据测试集数据和滑动窗口大小创建测试集的输入序列和输出值
X_train, y_train = trainX, trainY # 将训练集的输入序列和输出值赋值给X_train和y_train
X_test, y_test = testX, testY # 将测试集的输入序列和输出值赋值给X_test和y_test
model = Sequential() # 创建Sequential模型
model.add(LSTM(units=neurons1, return_sequences=True, input_shape=(look_back, 1))) # 添加第一个LSTM层,设置神经元个数为neurons1,输入形状为(look_back, 1)
model.add(LSTM(units=neurons2, return_sequences=True)) # 添加第二个LSTM层,设置神经元个数为neurons2
model.add(LSTM(neurons3, return_sequences=False)) # 添加第三个LSTM层,设置神经元个数为neurons3,返回序列结果
model.add(Dropout(dropout)) # 添加Dropout层,设置丢弃率为dropout
model.add(Dense(units=1)) # 添加输出层,神经元个数为1
model.add(Activation('relu')) # 添加激活函数为ReLU的层
model.compile(loss='mean_squared_error', optimizer='Adam') # 编译模型,使用均方误差作为损失函数,使用Adam优化器
return model, X_train, y_train, X_test, y_test # 返回构建好的模型以及训练集和测试集的输入序列和输出值
# In[9]:
def training(X):
lk = int(X[0]) # 将X的第一个元素转换为整数,表示滑动窗口的大小
neurons1 = int(X[1]) # 将X的第二个元素转换为整数,表示第一个LSTM层中神经元的个数
neurons2 = int(X[2]) # 将X的第三个元素转换为整数,表示第二个LSTM层中神经元的个数
neurons3 = int(X[3]) # 将X的第四个元素转换为整数,表示第三个LSTM层中神经元的个数
dropout = round(X[4], 6) # 将X的第五个元素保留六位小数,表示Dropout层的丢弃率
batch_size = int(X[5]) # 将X的第六个元素转换为整数,表示批次大小
print(X) # 打印X的值
model, X_train, y_train, X_test, y_test = build_model(lk, neurons1, neurons2, neurons3, dropout) # 调用build_model函数构建模型,并获得训练集和测试集的输入序列和输出值
model.fit(
X_train,
y_train,
batch_size=batch_size,
epochs=100,
validation_split=0.1,
verbose=0,
callbacks=[EarlyStopping(monitor='val_loss', patience=22, restore_best_weights=True)]) # 使用训练集训练模型,并设置相关参数和回调函数
pred = model.predict(X_test) # 使用训练好的模型进行预测
temp_mse = mean_squared_error(y_test, pred) # 计算均方误差
print(temp_mse) # 打印均方误差的值
return temp_mse # 返回均方误差的值
# In[10]:
class CSA():
def __init__(self, pop_size=5, n_dim=2, ap=0.1, lb=-1e5, ub=1e5, max_iter=20, func=None):
self.pop = pop_size
self.n_dim = n_dim
self.ap = ap # 感知概率
self.func = func
self.max_iter = max_iter # max iter
self.fly_length = [2 for _ in range(self.n_dim)] # 飞行距离,可以考虑是否采用莱维飞行或者随迭代次数改变
# 或许也和变量维数相关
self.lb, self.ub = np.array(lb) * np.ones(self.n_dim), np.array(ub) * np.ones(self.n_dim)
assert self.n_dim == len(self.lb) == len(self.ub), 'dim == len(lb) == len(ub) is not True'
assert np.all(self.ub > self.lb), 'upper-bound must be greater than lower-bound'
print('#更多模型搜索机器学习之心,支持模型定制')
self.X = np.random.uniform(low=self.lb, high=self.ub, size=(self.pop, self.n_dim))
self.Y = [self.func(self.X[i]) for i in range(len(self.X))] # y = f(x) for all particles
self.pbest_x = self.X.copy() # personal best location of every particle in history
self.pbest_y = [np.inf for i in range(self.pop)] # best image of every particle in history
self.gbest_x = self.pbest_x.mean(axis=0).reshape(1, -1) # global best location for all particles
self.gbest_y = np.inf # global best y for all part
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.Python实现CSA-LSTM乌鸦算法优化长短期记忆神经网络时间序列预测(完整源码和数据) anaconda + pycharm + python +Tensorflow 注意事项:保姆级注释,几乎一行一注释,方便小白入门学习! 2.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 3.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 4.作者介绍:某大厂资深算法工程师,从事Matlab、Python算法仿真工作8年;擅长智能优化算法、神经网络预测、信号处理、元胞自动机等多种领域的算法仿真实验,更多仿真源码、数据集定制私信+
资源推荐
资源详情
资源评论
收起资源包目录
CSA-LSTM(乌鸦).zip (3个子文件)
CSA-LSTM(乌鸦).py 13KB
焦作.csv 62KB
焦作全.csv 112KB
共 3 条
- 1
资源评论
机器学习之心
- 粉丝: 2w+
- 资源: 990
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功