#!/usr/bin/env python
# coding: utf-8
# In[1]:
import math # 导入math模块进行数学运算
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, mean_absolute_error, r2_score # 从scikit-learn导入评估指标
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 numpy # 导入numpy库
import copy # 导入copy模块
import warnings # 导入warnings模块进行警告控制
warnings.filterwarnings("ignore") # 忽略警告信息
# #更多模型搜索机器学习之心,支持模型定制
# In[2]:
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# In[3]:
def ALO(N, Max_iter, lb, ub, dim, fobj):
# 初始化位置的函数
def initialization(N, dim, ub, lb):
return np.random.uniform(lb, ub, (N, dim))
# 轮盘赌选择的函数
def roulette_wheel_selection(weights):
selection = np.random.rand() * sum(weights)
cumulative_sum = np.cumsum(weights)
selected_index = np.where(selection <= cumulative_sum)[0][0]
return selected_index
# 围绕蚁狮进行随机漫步的函数
def random_walk_around_antlion(dim, Max_iter, lb, ub, antlion_position, current_iter):
walk = np.zeros((Max_iter, dim))
for i in range(dim):
walk[:, i] = antlion_position[i] + np.random.uniform(-1, 1, Max_iter) * (ub[i] - lb[i])
# 边界检查
walk[:, i] = np.maximum(np.minimum(walk[:, i], ub[i]), lb[i])
return walk
# 初始化蚁狮和蚂蚁的位置
antlion_position = initialization(N, dim, ub, lb)
ant_position = initialization(N, dim, ub, lb)
sorted_antlions = np.zeros((N, dim), dtype=float)
elite_antlion_position = np.zeros(dim, dtype=float)
elite_antlion_fitness = np.inf
convergence_curve = np.zeros(Max_iter)
antlions_fitness = np.zeros(N)
ants_fitness = np.zeros(N)
# 计算初始蚁狮的适应度并排序
for i in range(antlion_position.shape[0]):
antlions_fitness[i] = fobj(antlion_position[i, :])
sorted_indexes = np.argsort(antlions_fitness)
sorted_antlions = antlion_position[sorted_indexes, :]
elite_antlion_position = sorted_antlions[0, :]
elite_antlion_fitness = antlions_fitness[0]
current_iter = 0
while current_iter < Max_iter:
# 模拟随机漫步
for i in range(ant_position.shape[0]):
# 根据适应度选择蚁狮(适应度越好,选择的概率越高)
rolette_index = roulette_wheel_selection(1. / antlions_fitness)
if rolette_index == -1:
rolette_index = 1
# RA是围绕选定的蚁狮进行的随机漫步
RA = random_walk_around_antlion(dim, Max_iter, lb, ub, sorted_antlions[rolette_index, :], current_iter)
# RE是围绕精英(迄今为止最好的蚁狮)进行的随机漫步
RE = random_walk_around_antlion(dim, Max_iter, lb, ub, elite_antlion_position, current_iter)
# 更新蚂蚁的位置,根据论文中的公式(2.13)
ant_position[i, :] = (RA[current_iter, :] + RE[current_iter, :]) / 2
for i in range(ant_position.shape[0]):
# 边界检查(将蚂蚁的位置限制在搜索空间内)
flag4ub = ant_position[i, :] > ub
flag4lb = ant_position[i, :] < lb
ant_position[i, :] = (ant_position[i, :] * ~(flag4ub + flag4lb)) + ub * flag4ub + lb * flag4lb
ants_fitness[i] = fobj(ant_position[i, :])
# 更新蚁狮的位置和适应度,基于蚂蚁(如果蚂蚁的适应度高于蚁狮,则假设蚂蚁被蚁狮捕获,蚁狮更新到蚂蚁的位置以建立陷阱)
double_population = np.vstack((sorted_antlions, ant_position))
double_fitness = np.concatenate((antlions_fitness, ants_fitness))
sorted_indexes = np.argsort(double_fitness)
double_sorted_population = double_population[sorted_indexes, :]
antlions_fitness = double_fitness[sorted_indexes][:N]
sorted_antlions = double_sorted_population[:N, :]
# 如果任何蚁狮的适应度高于精英,更新精英的位置
if antlions_fitness[0] < elite_antlion_fitness:
elite_antlion_position = sorted_antlions[0, :]
elite_antlion_fitness = antlions_fitness[0]
# 保持精英在种群中
sorted_antlions[0, :] = elite_antlion_position
antlions_fitness[0] = elite_antlion_fitness
# 更新收敛曲线
convergence_curve[current_iter] = elite_antlion_fitness
# 每隔50次迭代显示迭代次数和迄今为止获得的最佳最优解
if current_iter % 10 == 0:
print(f"迭代 {current_iter + 1}次时的最佳适应度为 {elite_antlion_fitness}")
current_iter += 1
return elite_antlion_fitness, elite_antlion_position, convergence_curve
# 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,输入�
Python实现ALO-LSTM蚁狮算法优化长短期记忆神经网络时间序列预测(完整源码和数据)
版权申诉
156 浏览量
2024-05-11
23:34:17
上传
评论
收藏 49KB ZIP 举报
机器学习之心
- 粉丝: 1w+
- 资源: 708
最新资源
- (完整)数据库课程设计餐厅点餐说明书-21ab6d3c8beb172ded630b1c59eef8c75ebf952c.doc
- 2023-04-06-项目笔记 - 第一百五十四阶段 - 4.4.2.152全局变量的作用域-152 -2024.06.04
- 松哥解协议松哥解协议松哥解协议松哥解协议松哥解协议
- 618节日618节日618节日
- tensorflow-gpu-2.9.1-cp37-cp37m-win-amd64.whl
- tensorflow-gpu-2.9.0-cp37-cp37m-win-amd64.whl
- tensorflow-gpu-2.9.0-cp39-cp39-win-amd64.whl
- lcd daimalcd daima
- 电影领域-推荐算法-个性化内容-观影决策-电影推荐小程序.zip
- 电气控制PLC考试题库
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈