蚁群算法ACO优化LSTM超参数
Posted nsq_ai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蚁群算法ACO优化LSTM超参数相关的知识,希望对你有一定的参考价值。
前言
- LSTM 航空乘客预测单步预测的两种情况。 简单运用LSTM 模型进行预测分析。
- 加入注意力机制的LSTM 对航空乘客预测采用了目前市面上比较流行的注意力机制,将两者进行结合预测。
- 多层 LSTM 对航空乘客预测 简单运用多层的LSTM 模型进行预测分析。
- 双向LSTM 对航空乘客预测双向LSTM网络对其进行预测。
- MLP多层感知器 对航空乘客预测简化版 使用MLP 对航空乘客预测
- CNN + LSTM 航空乘客预测采用的CNN + LSTM网络对其进行预测。
- ConvLSTM 航空乘客预测采用ConvLSTM 航空乘客预测
- LSTM的输入格式和输出个数说明 中对单步和多步的输入输出格式进行了解释
- LSTM 单变量多步预测航空乘客简单版
- LSTM 单变量多步预测航空乘客复杂版
- LSTM 多变量单步预测空气质量(1—》1) 用LSTM 前一个数据点的多变量预测下一个时间点的空气质量
- LSTM 多变量单步预测空气质量(3 —》1) 用LSTM 前三个数据点的多变量预测下一个时间点的空气质量
- 麻雀算法SSA优化LSTM超参数
本文主要是采用蚁群算法ACO优化LSTM超参数
程序
蚁群算法ACO优化算法,在此不对具体原理进行分析,针对代码实操.
ACO
代码介绍
class ACO:
def __init__(self, parameters):
"""
Ant Colony Optimization
parameter: a list type, like [NGEN, pop_size, var_num_min, var_num_max]
"""
# 初始化
self.NGEN = parameters[0] # 迭代的代数
self.pop_size = parameters[1] # 种群大小
self.var_num = len(parameters[2]) # 变量个数
self.bound = [] # 变量的约束范围
self.bound.append(parameters[2])
self.bound.append(parameters[3])
self.pop_x = np.zeros((self.pop_size, self.var_num)) # 所有蚂蚁的位置
self.g_best = np.zeros((1, self.var_num)) # 全局蚂蚁最优的位置
# 初始化第0代初始全局最优解
temp = -1
for i in range(self.pop_size):
for j in range(self.var_num):
self.pop_x[i][j] = np.random.uniform(self.bound[0][j], self.bound[1][j])
fit = self.fitness(self.pop_x[i])
if fit > temp:
self.g_best = self.pop_x[i]
temp = fit
def main(self):
popobj = []
best = np.zeros((1, self.var_num))[0]
for gen in range(1, self.NGEN + 1):
if gen == 1:
tmax, t = self.update_operator(gen, np.array(list(map(self.fitness, self.pop_x))),
np.max(np.array(list(map(self.fitness, self.pop_x)))))
else:
tmax, t = self.update_operator(gen, t, tmax)
popobj.append(self.fitness(self.g_best))
print('############ Generation ############'.format(str(gen)))
print(self.g_best)
print(self.fitness(self.g_best))
if self.fitness(self.g_best) > self.fitness(best):
best = self.g_best.copy()
print('最好的位置:'.format(best))
print('最大的函数值:'.format(self.fitness(best)))
print("---- End of (successful) Searching ----")
LSTM
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_test
优化超参数
if __name__ == '__main__':
'''
神经网络第一层神经元个数
神经网络第二层神经元个数
dropout比率
batch_size
'''
UP = [51, 6, 0.055, 9]
DOWN = [50, 5, 0.05, 8]
NGEN = 100
popsize = 100
parameters = [NGEN, popsize, DOWN, UP]
# 开始优化
aco = ACO(parameters)
aco.main()
# 训练模型 使用ssa找到的最好的神经元个数
neurons1 = int(aco.g_best[0])
neurons2 = int(aco.g_best[1])
dropout = aco.g_best[2]
batch_size = int(aco.g_best[3])
# neurons1 = 64
# neurons2 = 64
# dropout = 0.01
# batch_size = 32
model, X_train, y_train, X_test, y_test = build_model(neurons1, neurons2, dropout)
history1 = model.fit(X_train, y_train, epochs=150, 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)
# 反归一化
y_score = scaler.inverse_transform(y_score.reshape(-1, 1))
y_test = scaler.inverse_transform(y_test.reshape(-1, 1))
print("==========evaluation==============\\n")
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error #平方绝对误差
import math
MAE = mean_absolute_error(y_test, y_score)
print('MAE: %.4f ' % MAE)
RMSE = math.sqrt(mean_squared_error(y_test, y_score))
print('RMSE: %.4f ' % (RMSE))
总结
蚁群算法优化,算是比较老点的算法,但其仍然具有一定的价值
备注:
需要源代码和数据集,或者想要沟通交流,请私聊,谢谢.
使用Matlab实现蚁群优化(ACO)算法解决旅行商问题(Travelling Salesman Problem)
ACO算法的主要灵感来自stigmergy。这是指通过改变环境来促进自然界中生物的相互作用和协调。在 stigmergy 中,有机体所做的动作的痕迹刺激了随后的同一生物或其他生物的行为。例如,在一个白蚁群中,一只白蚁可能会扮演一个泥球,然后把它放在一个洞旁边。另一只白蚁识别出泥并用它来固定孔。本质上,这会导致复杂和分散的没有计划和直接沟通的情报。
群体智能:ACO 是众多群体智能方法之一。在这个领域,调查导致解决问题和智慧的生物的集体行为。
本文代码是旅行商问题中应用 ACO 的实现
代码:
clear all
close all
clc
%% Problem preparation
% Create the graph
[ graph ] = createGraph();
% Draw the graph
figure
subplot(1,3,1)
drawGraph( graph);
%% ACO algorithm
%% Initial parameters of ACO
maxIter = 500;
antNo = 50;
tau0 = 10 * 1 / ( graph.n * mean( graph.edges(:) ) ); % Initial phromone concentration
tau = tau0 * ones( graph.n , graph.n); % Phromone matirx
eta = 1./ graph.edges; % desirability of each edge
rho = 0.5; % Evaporation rate
alpha = 1; % Phromone exponential parameters
beta = 1; % Desirability exponetial paramter
%% Main loop of ACO
bestFitness = inf;
bestTour = [];
for t = 1 : maxIter
% Create Ants
colony = [];
colony = createColony( graph, colony , antNo, tau, eta, alpha, beta);
% Calculate the fitness values of all ants
for i = 1 : antNo
colony.ant(i).fitness = fitnessFunction(colony.ant(i).tour , graph );
end
% Find the best ant (queen)
allAntsFitness = [ colony.ant(:).fitness ];
[ minVal , minIndex ] = min( allAntsFitness );
if minVal < bestFitness
bestFitness = colony.ant(minIndex).fitness;
bestTour = colony.ant(minIndex).tour;
end
colony.queen.tour = bestTour;
colony.queen.fitness = bestFitness;
% Update phromone matrix
tau = updatePhromone( tau , colony );
% Evaporation
tau = ( 1 - rho ) .* tau;
% Display the results
outmsg = [ 'Iteration #' , num2str(t) , ' Shortest length = ' , num2str(colony.queen.fitness) ];
disp(outmsg)
subplot(1,3,1)
title(['Iteration #' , num2str(t) ])
% Visualize best tour and phromone concentration
subplot(1,3,2)
cla
drawBestTour( colony, graph );
subplot(1,3,3)
cla
drawPhromone( tau , graph );
drawnow
end
运行结果如下:
以上是关于蚁群算法ACO优化LSTM超参数的主要内容,如果未能解决你的问题,请参考以下文章
蚁群算法(AntColonyOptimization,ACO)与TSP问题
使用Matlab实现蚁群优化(ACO)算法解决旅行商问题(Travelling Salesman Problem)
使用Matlab实现蚁群优化(ACO)算法解决旅行商问题(Travelling Salesman Problem)