1、摘要

本文主要讲解:使用SSA麻雀算法-LSTM-优化神经网络神经元个数-dropout-batch_size
主要思路:

  1. SSA Parameters :优化函数、粒子数量、搜索维度、迭代次数
  2. LSTM Parameters 神经网络第一层神经元个数、神经网络第二层神经元个数、dropout比率、batch_size
  3. 开始搜索: 发现者(探索者)的位置更新;取出最大的适应度值和最差适应度的X;更新跟随着位置;预警值较小,说明没有捕食者出现;预警值较大,说明有捕食者出现威胁到了种群的安全,需要去其它地方觅食;加入者(追随者)的位置更新;
  4. 训练模型,使用SSA找到的最好的全局最优参数
  5. plt.show()

2、数据介绍

简单的时序数据

3、相关技术

麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法,在2020年提出,主要是受麻雀的觅食行为和反捕食行为的启发 。

4、完整代码和步骤

主运行程序入口

import osimport matplotlib
import 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.keras.callbacks import EarlyStopping
from tensorflow.keras.layers import Dense, Dropout, LSTM
from tensorflow.keras.models import Sequential
from tensorflow.python.keras.layers import Activationclass SSA():def __init__(self, func, n_dim=None, pop_size=20, max_iter=50, lb=-512, ub=512, verbose=False):self.func = funcself.n_dim = n_dim  # dimension of particles, which is the number of variables of funcself.pop = pop_size  # number of particlesP_percent = 0.2  # # 生产者的人口规模占总人口规模的20%D_percent = 0.1  # 预警者的人口规模占总人口规模的10%self.pNum = round(self.pop * P_percent)  # 生产者的人口规模占总人口规模的20%self.warn = round(self.pop * D_percent)  # 预警者的人口规模占总人口规模的10%self.max_iter = max_iter  # max iterself.verbose = verbose  # print the result of each iter or notself.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'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 particlesself.pbest_x = self.X.copy()  # personal best location of every particle in historyself.pbest_y = [np.inf for i in range(self.pop)]  # best image of every particle in historyself.gbest_x = self.pbest_x.mean(axis=0).reshape(1, -1)  # global best location for all particlesself.gbest_y = np.inf  # global best y for all particlesself.gbest_y_hist = []  # gbest_y of every iterationself.update_pbest()self.update_gbest()## record verbose valuesself.record_mode = Falseself.record_value = {'X': [], 'V': [], 'Y': []}self.best_x, self.best_y = self.gbest_x, self.gbest_y  # history reasons, will be deprecatedself.idx_max = 0self.x_max = self.X[self.idx_max, :]self.y_max = self.Y[self.idx_max]def cal_y(self, start, end):# calculate y for every x in Xfor i in range(start, end):self.Y[i] = self.func(self.X[i])# return self.Ydef update_pbest(self):'''personal best'''for i in range(len(self.Y)):if self.pbest_y[i] > self.Y[i]:self.pbest_x[i] = self.X[i]self.pbest_y[i] = self.Y[i]def update_gbest(self):idx_min = self.pbest_y.index(min(self.pbest_y))if self.gbest_y > self.pbest_y[idx_min]:self.gbest_x = self.X[idx_min, :].copy()self.gbest_y = self.pbest_y[idx_min]def find_worst(self):self.idx_max = self.Y.index(max(self.Y))self.x_max = self.X[self.idx_max, :]self.y_max = self.Y[self.idx_max]def update_finder(self):r2 = np.random.rand(1)  # 预警值self.idx = sorted(enumerate(self.Y), key=lambda x: x[1])self.idx = [self.idx[i][0] for i in range(len(self.idx))]# 这一部位为发现者(探索者)的位置更新if r2 < 0.8:  # 预警值较小,说明没有捕食者出现for i in range(self.pNum):r1 = np.random.rand(1)self.X[self.idx[i], :] = self.X[self.idx[i], :] * np.exp(-(i) / (r1 * self.max_iter))  # 对自变量做一个随机变换self.X = np.clip(self.X, self.lb, self.ub)  # 对超过边界的变量进行去除# X[idx[i], :] = Bounds(X[idx[i], :], lb, ub)  # 对超过边界的变量进行去除# fit[sortIndex[0, i], 0] = func(X[sortIndex[0, i], :])  # 算新的适应度值elif r2 >= 0.8:  # 预警值较大,说明有捕食者出现威胁到了种群的安全,需要去其它地方觅食for i in range(self.pNum):Q = np.random.rand(1)  # 也可以替换成  np.random.normal(loc=0, scale=1.0, size=1)self.X[self.idx[i], :] = self.X[self.idx[i], :] + Q * np.ones((1, self.n_dim))  # Q是服从正态分布的随机数。L表示一个1×d的矩阵self.X = np.clip(self.X, self.lb, self.ub)  # 对超过边界的变量进行去除# X[idx[i], :] = Bounds(X[sortIndex[0, i], :], lb, ub)# fit[sortIndex[0, i], 0] = func(X[sortIndex[0, i], :])self.cal_y(0, self.pNum)def update_follower(self):#  这一部位为加入者(追随者)的位置更新for ii in range(self.pop - self.pNum):i = ii + self.pNumA = np.floor(np.random.rand(1, self.n_dim) * 2) * 2 - 1best_idx = self.Y[0:self.pNum].index(min(self.Y[0:self.pNum]))bestXX = self.X[best_idx, :]if i > self.pop / 2:Q = np.random.rand(1)self.X[self.idx[i], :] = Q * np.exp((self.x_max - self.X[self.idx[i], :]) / np.square(i))else:self.X[self.idx[i], :] = bestXX + np.dot(np.abs(self.X[self.idx[i], :] - bestXX),1 / (A.T * np.dot(A, A.T))) * np.ones((1, self.n_dim))self.X = np.clip(self.X, self.lb, self.ub)  # 对超过边界的变量进行去除# X[self.idx[i],:] = Bounds(X[self.idx[i],lb,ub)# fit[self.idx[i],0] = func(X[self.idx[i], :])self.cal_y(self.pNum, self.pop)def detect(self):arrc = np.arange(self.pop)c = np.random.permutation(arrc)  # 随机排列序列b = [self.idx[i] for i in c[0: self.warn]]e = 10e-10for j in range(len(b)):if self.Y[b[j]] > self.gbest_y:self.X[b[j], :] = self.gbest_y + np.random.rand(1, self.n_dim) * np.abs(self.X[b[j], :] - self.gbest_y)else:self.X[b[j], :] = self.X[b[j], :] + (2 * np.random.rand(1) - 1) * np.abs(self.X[b[j], :] - self.x_max) / (self.func(self.X[b[j]]) - self.y_max + e)# X[sortIndex[0, b[j]], :] = Bounds(X[sortIndex[0, b[j]], :], lb, ub)# fit[sortIndex[0, b[j]], 0] = func(X[sortIndex[0, b[j]]])self.X = np.clip(self.X, self.lb, self.ub)  # 对超过边界的变量进行去除self.Y[b[j]] = self.func(self.X[b[j]])def run(self, max_iter=None):self.max_iter = max_iter or self.max_iterfor iter_num in range(self.max_iter):self.update_finder()  # 更新发现者位置self.find_worst()  # 取出最大的适应度值和最差适应度的Xself.update_follower()  # 更新跟随着位置self.update_pbest()self.update_gbest()self.detect()self.update_pbest()self.update_gbest()self.gbest_y_hist.append(self.gbest_y)return self.best_x, self.best_ynp.random.seed(666)
matplotlib.rcParams['agg.path.chunksize'] = 0
matplotlib.rcParams.update(matplotlib.rc_params())filename = 'lstm4_pso_'batch_size = 128
epochs = 2
steps = 10
scalerx = MinMaxScaler(feature_range=(0, 1))
scalery = MinMaxScaler(feature_range=(0, 1))def process_data():# usecols 代表使用数据的列索引,左闭右开# test_size代表划分20%到测试集X_train = X.iloc[:228, :]y_train = y.iloc[:228]X_test = X.iloc[228:, :]y_test = y.iloc[228:]return X_train, y_train, X_test, y_testdef create_dataset(X, y, seq_len):features = []targets = []  # 标签for i in range(0, len(X) - seq_len, 1):  # 此处的1表示步长,每隔一步滑一下data = X.iloc[i:i + seq_len]  # 序列数据;前闭后开label = y.iloc[i + seq_len]  # 标签数据# 保存到features和labelsfeatures.append(data)targets.append(label)trainX = np.array(features).astype('float64')return trainX, np.array(targets).reshape(-1, 1)def build_model(neurons1, neurons2, dropout):X_train, y_train, X_test, y_test = process_data()X_train, y_train = create_dataset(X_train, y_train, steps)X_test, y_test = create_dataset(X_test, y_test, steps)nb_features = X_train.shape[2]input1 = X_train.shape[1]model1 = Sequential()model1.add(LSTM(input_shape=(input1, nb_features),units=neurons1,return_sequences=True))model1.add(Dropout(dropout))model1.add(LSTM(units=neurons2,return_sequences=False))model1.add(Dropout(dropout))model1.add(Dense(units=1))model1.add(Activation("linear"))model1.compile(loss='mse', optimizer='Adam', metrics='mae')return model1, 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=1,callbacks=[EarlyStopping(monitor='val_loss', patience=22, restore_best_weights=True)])pred = model.predict(X_test)temp_mse = mean_squared_error(y_test, pred)return temp_mseif __name__ == '__main__':'''神经网络第一层神经元个数神经网络第二层神经元个数dropout比率batch_size'''UP = [150, 15, 0.5, 16]DOWN = [50, 5, 0.05, 8]# 开始优化ssa = SSA(training, n_dim=4, pop_size=22, max_iter=128, lb=DOWN, ub = UP)ssa.run()print('best_params is ', ssa.gbest_x)print('best_precision is', 1 - ssa.gbest_y)# 训练模型  使用PSO找到的最好的神经元个数neurons1 = int(ssa.gbest_x[0])neurons2 = int(ssa.gbest_x[1])dropout = ssa.gbest_x[2]batch_size = int(ssa.gbest_x[3])model, X_train, y_train, X_test, y_test = build_model(neurons1, neurons2, dropout)history1 = model.fit(X_train, y_train, epochs=1, batch_size=batch_size, validation_split=0.2, verbose=1,callbacks=[EarlyStopping(monitor='val_loss', patience=9, restore_best_weights=True)])# 测试集预测y_score = model.predict(X_test)# 反归一化scaler_y_score = scalery.inverse_transform(y_score)scaler_y_test = scalery.inverse_transform(y_test)# 画图plt.figure(figsize=(10, 10))plt.plot(scaler_y_score)plt.plot(scaler_y_test)plt.title('real vs pred test')plt.ylabel('V')plt.xlabel('X')plt.legend(['pred', 'real'], loc='lower right')plt.savefig(src1 + filename + 'pred_real.png')plt.show()

代码比较复杂,如需帮忙请私聊

5、学习链接

麻雀搜索算法(SSA)求解大规模函数优化问题(附源代码)

SSA麻雀算法-LSTM-优化神经网络神经元个数-dropout-batch_size相关推荐

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

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

  2. 灰狼算法优化LSTM超参数-神经元个数-dropout-batch_size

    1.摘要 本文主要讲解:使用灰狼算法优化LSTM超参数-神经元个数-dropout-batch_size 主要思路: 灰狼算法 Parameters : 迭代次数.狼的寻值范围.狼的数量 LSTM P ...

  3. SSA麻雀算法优化BP神经网络(SSA-BPNN)回归预测MATLAB代码(有优化前后的对比

    SSA麻雀算法优化BP神经网络(SSA-BPNN)回归预测MATLAB代码(有优化前后的对比) 代码注释清楚. main为运行主程序,可以读取本地EXCEL数据. 很方便,容易上手. (以电厂运行数据 ...

  4. 基于MATLAB樽海鞘算法SSA(麻雀算法(十一)也简称SSA)的Eggholeer函数优化,测试函数的100种优化方法之十二

    樽海鞘算法优化 Eggholder测试函数 樽海鞘算法SSA(麻雀算法也简称SSA,如果想了解麻雀算法,看方法十一)模拟了樽海鞘的聚集成链的生活习性而提出的优化算法,是近几年刚推出的新算法之一.算法将 ...

  5. 【BP回归预测】基于matlab随机蛙跳算法SFLA优化神经网络数据回归预测【含Matlab源码 2272期】

    ⛄一.蛙跳算法 1 改进的免疫蛙跳算法 免疫蛙跳算法具有混合蛙跳算法的全局优化与局部细致搜索优点, 可以优化连续问题和离散问题, 具有较强的鲁棒性;同时, 群体具有的免疫机制对群体进行控制和调节, 把 ...

  6. 【预测模型】基于Logistic混沌映射改进麻雀算法改进BP神经网络实现数据预测matlab源码

    1  模型 简介见这里. 2 部分代码 function [FoodFitness,FoodPosition,Convergence_curve]=SSA(N,Max_iter,lb,ub,dim,f ...

  7. 【BP回归预测】随机蛙跳算法SFLA优化神经网络数据回归预测【含Matlab源码 2272期】

    ⛄一.蛙跳算法 1 改进的免疫蛙跳算法 免疫蛙跳算法具有混合蛙跳算法的全局优化与局部细致搜索优点, 可以优化连续问题和离散问题, 具有较强的鲁棒性;同时, 群体具有的免疫机制对群体进行控制和调节, 把 ...

  8. 蚁群算法优化神经网络matlab源程序,粒子群优化神经网络的程序大集合

    粒子群程序集合 866867259psobp psobp.m pso(粒子群算法)优化神经网络 粒子群算法(PSO)应用于神经网络优化[matlab] PSOt A Particle Swarm Op ...

  9. 基于麻雀算法的无人机航迹规划 - 附代码

    基于麻雀算法的无人机航迹规划 文章目录 基于麻雀算法的无人机航迹规划 1.麻雀搜索算法 2.无人机飞行环境建模 3.无人机航迹规划建模 4.实验结果 4.1地图创建 4.2 航迹规划 5.参考文献 6 ...

最新文章

  1. WinCE流驱动加载的控制
  2. 安装sql server 2008 报错
  3. Python 用 if __name__ == ‘__main__‘:语句来控制代码是被直接运行还是导包执行
  4. Linux网络配置:设置IP地址、网关DNS、主机名
  5. Java学习日报—SQL基础—2021/11/29
  6. 外链引入css有哪些方式_CSS 文件的4种引入方式
  7. python读excel并写入_Python 写入和读取Excel数据
  8. C语言之fwrite()与fprintf()区别(十一)
  9. 删除一个空目录的JAVA代码
  10. hexo+next主题美化
  11. 降采样 matlab,改进型64倍降采样数字抽取滤波器的设计与仿真分析
  12. 如何导出html中的图片,一键保存网页中的全部图片
  13. 云端卫士助力运营商实现DDoS安全业务的统一运营
  14. 领导让谈入职公司的感受
  15. Win32关于调整窗口大小时,窗口闪烁问题及解决办法
  16. PLC控制例子——中央空调机房控制系统
  17. 东风岚图配谈“梦想”吗?
  18. Springboot, link failure、SSL peer shut down incorrectly、Unsupported record version Unknown-0.0问题
  19. nginx 获取body参数_nginx 处理request body参数配置
  20. 达梦数据库数据迁移工具的使用

热门文章

  1. 国际金融2019尔雅满分答案
  2. FPGA的六层电梯控制器Verilog语言
  3. 微信小程序-RSA签名、验签、加密、解密
  4. Android Studio最全插件
  5. 0X Swagger2
  6. linux mt命令,Cheat—— 给Linux初学者和管理员一个终极命令行备忘单
  7. IDC评述网:12月上旬全球域名解析服务商Top15
  8. 10040---微信与朋友圈后台架构
  9. 80老翁谈人生(342):火星人是护法天使、科普神童
  10. OCR:光学字符识别技术