#!/usr/bin/env python
# coding: utf-8
# In[1]:
import math # 导入math模块,用于数学计算
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块,用于绘图
import numpy as np # 导入numpy模块,用于数值计算和数组操作
import pandas as pd # 导入pandas模块,用于数据处理和分析
from sklearn.metrics import mean_squared_error # 导入mean_squared_error函数,用于计算均方误差
from sklearn.metrics import mean_absolute_error # 导入mean_absolute_error函数,用于计算平方绝对误差
from sklearn.metrics import r2_score # 导入r2_score函数,用于计算R平方
from sklearn.preprocessing import MinMaxScaler # 导入MinMaxScaler类,用于数据归一化
from tensorflow.python.keras.callbacks import EarlyStopping # 导入EarlyStopping回调函数,用于早停策略
from tensorflow.python.keras.layers import Dense, Dropout, LSTM # 导入Dense、Dropout、LSTM层
from tensorflow.python.keras.layers.core import Activation # 导入Activation层,用于激活函数
from tensorflow.python.keras.models import Sequential # 导入Sequential模型,用于构建神经网络模型
import tensorflow as tf # 导入tensorflow模块,用于深度学习框架
# In[2]:
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# In[3]:
#更多模型搜索机器学习之心,支持模型定制
# 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]:
look_back = 10# 定义时序窗口大小
trainX, trainY = creat_dataset(train, look_back)# 生成训练集
testX, testY = creat_dataset(test, look_back)# 生成测试集
# In[9]:
def build_model(neurons1, neurons2, dropout):#定义一个函数,用于构建 LSTM 模型
# 将训练集和测试集的输入和输出数据分别赋值给 X_train、y_train、X_test 和 y_test
X_train, y_train = trainX, trainY
X_test, y_test = testX, testY
model = Sequential()# 创建 Sequential 模型
model.add(LSTM(units=neurons1, return_sequences=True, input_shape=(look_back, 1)))# 添加第一个 LSTM 层,指定神经元个数和输入数据形状
model.add(LSTM(units=neurons2, return_sequences=False))# 添加第二个 LSTM 层,指定神经元个数
model.add(Dropout(dropout))# 添加 Dropout 层,指定失活率
model.add(Dense(units=1))# 添加全连接层,输出维度为 1
model.add(Activation('relu'))# 添加激活函数层,使用 ReLU 函数
model.compile(loss='mean_absolute_error', optimizer='Adam')# 编译模型,指定损失函数和优化器
return model, X_train, y_train, X_test, y_test# 返回构建好的模型以及训练集和测试集的输入和输出数据
# In[10]:
def training(X):
neurons1 = int(X[0]) # 从 X 中获取超参数 neurons1,并将其转换为整数
neurons2 = int(X[1]) # 从 X 中获取超参数 neurons2,并将其转换为整数
dropout = round(X[2], 6) # 从 X 中获取超参数 dropout,并将其保留 6 位小数
batch_size = int(X[3]) # 从 X 中获取超参数 batch_size,并将其转换为整数
print([neurons1, neurons2, dropout, batch_size]) # 打印超参数列表
model, X_train, y_train, X_test, y_test = build_model(neurons1, neurons2, dropout) # 构建模型并获取训练集、测试集
model.fit(
X_train,
y_train,
batch_size=batch_size,
epochs=100,
validation_split=0.1,
verbose=0,
callbacks=[EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)]) # 训练模型
#更多模型搜索机器学习之心,支持模型定制
pred = model.predict(X_test) # 在测试集上进行预测
temp_mse = mean_squared_error(y_test, pred) # 计算预测结果与真实值之间的均方误差
print(temp_mse) # 打印均方误差
return temp_mse # 返回均方误差作为适应度函数的结果
# In[11]:
class woa():
# 初始化
def __init__(self, LB, UB, dim=4, b=1, whale_num=20, max_iter=500):
self.LB = LB # 参数的下限
self.UB = UB # 参数的上限
self.dim = dim # 参数的维度
self.whale_num = whale_num # 鲸鱼的数量
self.max_iter = max_iter # 最大迭代次数
self.b = b # woa算法中的参数
# 初始化鲸鱼的位置
self.X = np.random.uniform(0, 1, (whale_num, dim)) * (UB - LB) + LB
self.gBest_score = np.inf # 全局最佳适应度分数
self.gBest_curve = np.zeros(max_iter) # 全局最佳适应度曲线
self.gBest_X = np.zeros(dim) # 全局最佳参数
# 适应度函数,用于评估参数的优劣
def fitFunc(self, para):
# 建立模型并计算适应度
mse = training(para)
return mse
#更多模型搜索机器学习之心,支持模型定制
# WOA算法的优化过程
def opt(self):
t = 0
while t < self.max_iter:
print('At iteration: ' + str(t))
for i in range(self.whale_num):
# 防止X溢出边界
self.X[i, :] = np.clip(self.X[i, :], self.LB, self.UB) # 检查边界
fitness = self.fitFunc(self.X[i, :]) # 计算适应度
# 更新全局最佳适应度分数和参数
if fitness <= self.gBest_score:
self.gBest_score = fitness
self.gBest_X = self.X[i, :].copy()
print('self.gBest_score: ', self.gBest_score)
print('self.gBest_X: ', self.gBest_X)
a = 2 * (self.max_iter - t) / self.max_iter
# 更新鲸鱼的位置
for i in range(self.whale_num):
p = np.random.uniform()
R1 = np.random.uniform()
R2 = np.random.uniform()
A = 2 * a * R1 - a
C = 2 * R2
l = 2 * np.random.uniform() - 1
# 如果随机值大于0.5,按照以下算法更新位置
if p >= 0.5:
D = abs(self.gBest_X - self.X[i, :])
self.X[i, :] = D * np.exp(self.b * l) * np.cos(2 * np.pi * l) + self.gBest_X
else:
# 如果随机值小于0.5,按照以下算法更新位置
if abs(A) < 1:
D = abs(C * self.gBest_X - self.X[i, :])
self.X[i, :] = self.gBest_X - A * D
else:
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
1.Python实现WOA-LSTM鲸鱼算法优化长短期记忆神经网络时间序列预测(完整源码和数据) anaconda + pycharm + python +Tensorflow 注意事项:保姆级注释,几乎一行一注释,方便小白入门学习! 2.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 3.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 4.作者介绍:某大厂资深算法工程师,从事Matlab、Python算法仿真工作8年;擅长智能优化算法、神经网络预测、信号处理、元胞自动机等多种领域的算法仿真实验,更多仿真源码、数据集定制私信+
资源推荐
资源详情
资源评论
收起资源包目录
WOA-LSTM (鲸鱼).zip (3个子文件)
WOA-LSTM (鲸鱼).py 13KB
焦作.csv 62KB
焦作全.csv 112KB
共 3 条
- 1
资源评论
机器学习之心
- 粉丝: 1w+
- 资源: 698
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HTML+CSS制作的个人博客网页.zip
- IMG_20240521_094903.jpg
- 基于htmlde 爱心代码,但HTML网页源码.zip
- 51单片机实现LED流水灯
- 基于Python的obEspoir分布式游戏框架设计源码
- 基于python的机械设计实用计算器,可计算电动机,传动装置,V带轮,齿轮,轴,轴承的几何或者力,运动学参数数值+源码+开发文档
- 基于HTML +JavaScript的元旦倒计时代码.docx
- 【Unity资源免费分享】孩子益智小游戏unity 5x系列Baby Doll House Cleaning
- 【资源免费分享】集市游戏(uniyt案例)
- 数据整理结果 2023-12-7 192544 6.dta
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功