蚁群算法ACO优化LSTM超参数

Posted nsq_ai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蚁群算法ACO优化LSTM超参数相关的知识,希望对你有一定的参考价值。

前言

  1. LSTM 航空乘客预测单步预测的两种情况。 简单运用LSTM 模型进行预测分析。
  2. 加入注意力机制的LSTM 对航空乘客预测采用了目前市面上比较流行的注意力机制,将两者进行结合预测。
  3. 多层 LSTM 对航空乘客预测 简单运用多层的LSTM 模型进行预测分析。
  4. 双向LSTM 对航空乘客预测双向LSTM网络对其进行预测。
  5. MLP多层感知器 对航空乘客预测简化版 使用MLP 对航空乘客预测
  6. CNN + LSTM 航空乘客预测采用的CNN + LSTM网络对其进行预测。
  7. ConvLSTM 航空乘客预测采用ConvLSTM 航空乘客预测
  8. LSTM的输入格式和输出个数说明 中对单步和多步的输入输出格式进行了解释
  9. LSTM 单变量多步预测航空乘客简单版
  10. LSTM 单变量多步预测航空乘客复杂版
  11. LSTM 多变量单步预测空气质量(1—》1) 用LSTM 前一个数据点的多变量预测下一个时间点的空气质量
  12. LSTM 多变量单步预测空气质量(3 —》1) 用LSTM 前三个数据点的多变量预测下一个时间点的空气质量
  13. 麻雀算法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









运行结果如下:

 获取完整代码:https://ai.52learn.online/code/38

以上是关于蚁群算法ACO优化LSTM超参数的主要内容,如果未能解决你的问题,请参考以下文章

ACO 蚁群算法(算法流程,TSP例子解析)

蚁群算法(AntColonyOptimization,ACO)与TSP问题

使用Matlab实现蚁群优化(ACO)算法解决旅行商问题(Travelling Salesman Problem)

使用Matlab实现蚁群优化(ACO)算法解决旅行商问题(Travelling Salesman Problem)

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

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