1、摘要

本文主要讲解:使用灰狼算法优化LSTM超参数-神经元个数-dropout-batch_size
主要思路:

  1. 灰狼算法 Parameters : 迭代次数、狼的寻值范围、狼的数量
  2. LSTM Parameters 神经网络第一层神经元个数、神经网络第二层神经元个数、dropout比率、batch_size
  3. 开始搜索:初始化所有狼的位置、迭代寻优、返回超出搜索空间边界的搜索代理、计算每个搜索代理的目标函数、更新 Alpha, Beta, and Delta
  4. 训练模型,使用灰狼算法找到的最好的全局最优参数
  5. plt.show()

2、数据介绍

zgpa_train.csv
DIANCHI.csv

需要数据的话去我其他文章的评论区
可接受定制

3、相关技术

灰狼优化算法(GWO),灵感来自于灰狼.GWO算法模拟了自然界灰狼的领导层级和狩猎机制.四种类型的灰狼。此外,还实现了狩猎的三个主要步骤:寻找猎物、包围猎物和攻击猎物。

PSO与GWO对比试验结果如下图:
灰狼算法

4、完整代码和步骤

此程序运行代码版本为:

tensorflow==2.5.0
numpy==1.19.5
keras==2.6.0
matplotlib==3.5.2

代码输出如下:

主运行程序入口
LSTM_GWO.py

import math
import os
import randomimport matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import MinMaxScaler
from tensorflow.python.keras.callbacks import EarlyStopping
from tensorflow.python.keras.layers import Dense, Dropout, LSTM
from tensorflow.python.keras.layers.core import Activation
from tensorflow.python.keras.models import Sequential
import numpy as numpyos.chdir(r'D:\项目\PSO-LSTM\具体需求')
'''
灰狼算法优化LSTM
'''
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号def GWO(objf, lb, ub, dim, SearchAgents_no, Max_iter):# ===初始化 alpha, beta, and delta_pos=======Alpha_pos = numpy.zeros(dim)  # 位置.形成30的列表Alpha_score = float("inf")  # 这个是表示“正负无穷”,所有数都比 +inf 小;正无穷:float("inf"); 负无穷:float("-inf")Beta_pos = numpy.zeros(dim)Beta_score = float("inf")Delta_pos = numpy.zeros(dim)Delta_score = float("inf")  # float() 函数用于将整数和字符串转换成浮点数。# ====list列表类型=============if not isinstance(lb, list):  # 作用:来判断一个对象是否是一个已知的类型。其第一个参数(object)为对象,第二个参数(type)为类型名,若对象的类型与参数二的类型相同则返回Truelb = [lb] * dim  # 生成[100,100,.....100]30个if not isinstance(ub, list):ub = [ub] * dim# ========初始化所有狼的位置===================Positions = numpy.zeros((SearchAgents_no, dim))for i in range(dim):  # 形成5*30个数[-100,100)以内Positions[:, i] = numpy.random.uniform(0, 1, SearchAgents_no) * (ub[i] - lb[i]) + lb[i]  # 形成[5个0-1的数]*100-(-100)-100Convergence_curve = numpy.zeros(Max_iter)# ========迭代寻优=====================for l in range(0, Max_iter):  # 迭代1000for i in range(0, SearchAgents_no):  # 5# ====返回超出搜索空间边界的搜索代理====for j in range(dim):  # 30Positions[i, j] = numpy.clip(Positions[i, j], lb[j], ub[j])  # clip这个函数将将数组中的元素限制在a_min(-100), a_max(100)之间,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min。# ===计算每个搜索代理的目标函数==========fitness = objf(Positions[i, :])  # 把某行数据带入函数计算# print("经过计算得到:",fitness)# ====更新 Alpha, Beta, and Delta================if fitness < Alpha_score:Alpha_score = fitness  # Update alphaAlpha_pos = Positions[i, :].copy()if (fitness > Alpha_score and fitness < Beta_score):Beta_score = fitness  # Update betaBeta_pos = Positions[i, :].copy()if (fitness > Alpha_score and fitness > Beta_score and fitness < Delta_score):Delta_score = fitness  # Update deltaDelta_pos = Positions[i, :].copy()# ===========以上的循环里,Alpha、Beta、Delta===========a = 2 - l * ((2) / Max_iter)  # a从2线性减少到0for i in range(0, SearchAgents_no):for j in range(0, dim):r1 = random.random()  # r1 is a random number in [0,1]主要生成一个0-1的随机浮点数。r2 = random.random()  # r2 is a random number in [0,1]A1 = 2 * a * r1 - a  # Equation (3.3)C1 = 2 * r2  # Equation (3.4)# D_alpha表示候选狼与Alpha狼的距离D_alpha = abs(C1 * Alpha_pos[j] - Positions[i, j])  # abs() 函数返回数字的绝对值。Alpha_pos[j]表示Alpha位置,Positions[i,j])候选灰狼所在位置X1 = Alpha_pos[j] - A1 * D_alpha  # X1表示根据alpha得出的下一代灰狼位置向量r1 = random.random()r2 = random.random()A2 = 2 * a * r1 - a  #C2 = 2 * r2D_beta = abs(C2 * Beta_pos[j] - Positions[i, j])X2 = Beta_pos[j] - A2 * D_betar1 = random.random()r2 = random.random()A3 = 2 * a * r1 - aC3 = 2 * r2D_delta = abs(C3 * Delta_pos[j] - Positions[i, j])X3 = Delta_pos[j] - A3 * D_deltaPositions[i, j] = (X1 + X2 + X3) / 3  # 候选狼的位置更新为根据Alpha、Beta、Delta得出的下一代灰狼地址。Convergence_curve[l] = Alpha_scoreif (l % 1 == 0):print(['迭代次数为' + str(l) + ' 的迭代结果' + str(Alpha_score)])  # 每一次的迭代结果# 绘图plt.plot(Convergence_curve)plt.title('Convergence_curve')plt.show()print("The best solution obtained by GWO is : " + str(Alpha_pos))print("The best optimal value of the objective funciton found by GWO is : " + str(Alpha_score))return Alpha_pos,Alpha_scoredef 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)dataframe = pd.read_csv('zgpa_train.csv', header=0, parse_dates=[0], index_col=0, usecols=[0, 5], squeeze=True)
dataset = dataframe.values
data = pd.read_csv('DIANCHI.csv', header=0)
z = data['fazhi']scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset.reshape(-1, 1))train_size = int(len(dataset) * 0.8)
test_size = len(dataset) - train_size
train, test = dataset[0: train_size], dataset[train_size: len(dataset)]
look_back = 10
trainX, trainY = creat_dataset(train, look_back)
testX, testY = creat_dataset(test, look_back)def build_model(neurons1, neurons2, dropout):X_train, y_train = trainX, trainYX_test, y_test = testX, testYmodel = Sequential()# model.add(LSTM(input_dim=1, units=50, return_sequences=True))model.add(LSTM(input_dim=neurons1, units=50, return_sequences=True, input_shape=(10, 1)))# model.add(LSTM(input_dim=50, units=100, return_sequences=True))model.add(LSTM(input_dim=neurons2, units=100, return_sequences=True))model.add(LSTM(input_dim=100, units=200, return_sequences=True))model.add(LSTM(300, return_sequences=False))# model.add(Dropout(0.2))model.add(Dropout(dropout))model.add(Dense(100))model.add(Dense(units=1))model.add(Activation('relu'))model.compile(loss='mean_squared_error', optimizer='Adam')return model, X_train, y_train, X_test, y_testdef training(X):neurons1 = int(X[0])neurons2 = int(X[1])dropout = round(X[2], 6)batch_size = int(X[3])print(X)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=1,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_mseif __name__ == '__main__':'''神经网络第一层神经元个数神经网络第二层神经元个数dropout比率batch_size'''ub = [10, 26, 0.25, 8]lb = [6, 22, 0.2, 2]# ===========主程序================Max_iter = 3  # 迭代次数dim = 4  # 狼的寻值范围SearchAgents_no = 5  # 寻值的狼的数量Alpha_pos,Alpha_score = GWO(training, lb, ub, dim, SearchAgents_no, Max_iter)print('best_params is ', Alpha_pos)print('best_precision is', Alpha_score)# 训练模型  使用PSO找到的最好的神经元个数neurons1 = int(Alpha_pos[0])neurons2 = int(Alpha_pos[1])dropout = Alpha_pos[2]batch_size = int(Alpha_pos[3])model, X_train, y_train, X_test, y_test = build_model(neurons1, neurons2, dropout)history = model.fit(X_train, y_train, epochs=333, batch_size=batch_size, validation_split=0.2, verbose=1,callbacks=[EarlyStopping(monitor='val_loss', patience=29, restore_best_weights=True)])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)trainScore = math.sqrt(mean_squared_error(trainY, trainPredict[:, 0]))# print('Train Score %.2f RMSE' %(trainScore))testScore = math.sqrt(mean_squared_error(testY, testPredict[:, 0]))# print('Test Score %.2f RMSE' %(trainScore))trainPredictPlot = np.empty_like(dataset)trainPredictPlot[:] = np.nantrainPredictPlot = np.reshape(trainPredictPlot, (dataset.shape[0], 1))trainPredictPlot[look_back: len(trainPredict) + look_back, :] = trainPredicttestPredictPlot = np.empty_like(dataset)testPredictPlot[:] = np.nantestPredictPlot = np.reshape(testPredictPlot, (dataset.shape[0], 1))testPredictPlot[len(trainPredict) + (look_back * 2) + 1: len(dataset) - 1, :] = testPredictplt.plot(history.history['loss'])plt.title('model loss')plt.ylabel('loss')plt.xlabel('epoch')plt.show()fig2 = plt.figure(figsize=(20, 15))plt.rcParams['font.family'] = ['STFangsong']ax = plt.subplot(222)plt.plot(scaler.inverse_transform(dataset), 'b-', label='实验数据')plt.plot(trainPredictPlot, 'r', label='训练数据')plt.plot(testPredictPlot, 'g', label='预测数据')plt.plot(z, 'k-', label='寿命阀值RUL')plt.ylabel('capacity', fontsize=20)plt.xlabel('cycle', fontsize=20)plt.legend()name = 'neurons1_' + str(neurons1) + 'neurons2_' + str(neurons2) + '_dropout' + str(dropout) + '_batch_size' + str(batch_size)plt.savefig('D:\项目\PSO-LSTM\具体需求\photo\\' + name + '.png')plt.show()

灰狼算法优化LSTM超参数-神经元个数-dropout-batch_size相关推荐

  1. PSO粒子群优化CNN-优化神经网络神经元个数dropout和batch_size等超参数

    1.摘要 本文主要讲解:PSO粒子群优化-CNN-优化神经网络神经元个数dropout和batch_size,目标为对沪深300价格进行预测 主要思路: PSO Parameters :粒子数量.搜索 ...

  2. 【回归预测-LSTM预测】基于灰狼算法优化LSTM实现数据回归预测附Matlab代码

    1 内容介绍 一种基于灰狼算法优化LSTM的网络流量预测方法,属于网络流量预测领域,该方法包括以下步骤:对第一网络流量数据集进行极差标准化处理,得到第二网络流量数据集,并划分为训练集和测试集,并确定灰 ...

  3. 机器学习之MATLAB代码--MATLAB量子粒子群优化LSTM超参数负荷预测(十三)

    机器学习之MATLAB代码--MATLAB量子粒子群优化LSTM超参数负荷预测(十三) 代码 数据 结果 代码 代码按照下列顺序依次: 1. function result(true_value,pr ...

  4. 贝叶斯优化LSTM超参数

    1.摘要 本文主要讲解:使用贝叶斯优化LSTM超参数 主要思路: 下载IMDB数据集,并将其变为序列数据 建立LSTM模型并训练 画准确率和损失曲线图 2.数据介绍 IMDB 数据集介绍 IMDB 数 ...

  5. 【LSTM回归预测】基于matlab灰狼算法优化LSTM回归预测【含Matlab源码 2038期】

    ⛄一.灰狼算法及LSTM简介 1 灰狼算法简介 1.1 前言 灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种 ...

  6. 【锂电池容量预测】基于matlab灰狼算法优化LSTM神经网络锂电池容量预测【含Matlab源码 2004期】

    一.灰狼算法简介 1 前言: 灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优化算法.该算法受到了灰狼 ...

  7. 【机器学习】算法模型自动超参数优化方法

    什么是超参数? 学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter).还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(Hyper ...

  8. 全网最全:机器学习算法模型自动超参数优化方法汇总

    什么是超参数? 学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter).还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(Hyper ...

  9. 回归预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络多输入单输出回归预测

    回归预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现GWO-LSTM灰狼算法优化长短期记忆神经网络多输入单输出回归预测 ...

最新文章

  1. HTC VIVE SDK 中的例子 hellovr_opengl 程序流程分析
  2. Linux常用的文本查找命令 find
  3. mysql-python 安装错误: Cannot open include file: 'config-win.h': No such file or directory
  4. x = x (x-1)
  5. Mysql Incorrect DATETIME value: ‘01/01/2021 00:00:00‘
  6. 【转载保存】java四种线程池的使用
  7. 信息学奥赛课课通VS中学生计算机,数学奥赛VS信息学奥赛 孩子们该如何选择
  8. 来一场蛋白和小分子的风花雪月
  9. python和别的脚本语言_PHP与Python与其它脚本语言
  10. IDEA的Database表的基本操作
  11. 爬虫python创意_最经典的Python爬虫(图片)案例
  12. fms2.0视频服务器系统,[FMS]adobe FMS(flash media server )服务器安装过程
  13. hystrix实战--资源隔离技术简介
  14. FPGA,关于安装使用libero IDE V9.2 及其gold floating license配置
  15. 有效沟通bic法则_南宁人际沟通培训
  16. 小程序 canvas 绘制图片
  17. Qt 串口数据采集并绘图
  18. android java join_java中的join用法
  19. 异常图标导致转码失败
  20. BugkuCTF之分析题之中国菜刀

热门文章

  1. 【前言】 VVC理论知识之基本框架
  2. pyarrow.lib.ArrowInvalid: Casting from timestamp[us] to timestamp[ns] would result in out of bounds
  3. 惠州掠影:(一)挥不去的少年印记
  4. PCF2.5重磅发布!Istio和Envoy助力开发人员工作更高效!
  5. Fastly 全球规模边缘云计算实践
  6. 安装完JDK后没有JRE文件怎么办
  7. 阿里国际站如何有效覆盖关键词+关键词推广评分详解
  8. js中的事件对象event (获取元素的,x,y坐标)
  9. 带有示例的Python datetime weekday()方法
  10. js:bind(this)这是什么写法