利用遗传算法GA和粒子群算法PSO优化算法,将BP神经网络训练集的MSE作为适应度函数,获取最优的权值和阈值在反向输入到BP神经网络里构建回归预测模型,同时能够打印出模型的多个评价指标,具体效果可以看图

在机器学习领域,BP神经网络是一种常用的模型,但它初始权值和阈值的随机设定,常常导致模型陷入局部最优,影响预测精度。遗传算法(GA)和粒子群算法(PSO)作为优秀的优化算法,可以用来解决这个问题。今天就来聊聊如何用GA和PSO优化BP神经网络,构建回归预测模型,并打印出多个评价指标。

1. 适应度函数

我们把BP神经网络训练集的均方误差(MSE)作为适应度函数。为啥选MSE呢?因为它能直观地反映预测值和真实值之间的误差平方的均值,误差越小,模型预测越准。

代码示例(Python 用`numpy`计算MSE)

import numpy as np

def calculate_mse(y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

代码分析

这段代码很简单,接收真实值ytrue和预测值ypred两个数组,先计算每个元素的误差平方,再用np.mean求均值,得到MSE。

2. 遗传算法(GA)优化

遗传算法模拟生物进化过程,通过选择、交叉和变异等操作,不断迭代优化种群,寻找最优解。在我们的场景里,就是找BP神经网络最优的权值和阈值。

部分GA代码示例

import random

# 初始化种群
def initialize_population(pop_size, num_weights_thresholds):
    population = []
    for _ in range(pop_size):
        individual = [random.random() for _ in range(num_weights_thresholds)]
        population.append(individual)
    return population

# 选择操作
def selection(population, fitness_values):
    total_fitness = sum(fitness_values)
    selection_probs = [fitness / total_fitness for fitness in fitness_values]
    selected_indices = np.random.choice(len(population), size=len(population), p=selection_probs)
    new_population = [population[i] for i in selected_indices]
    return new_population

# 交叉操作
def crossover(parent1, parent2, crossover_rate):
    if random.random() < crossover_rate:
        crossover_point = random.randint(1, len(parent1) - 1)
        child1 = parent1[:crossover_point] + parent2[crossover_point:]
        child2 = parent2[:crossover_point] + parent1[crossover_point:]
        return child1, child2
    return parent1, parent2

代码分析

initializepopulation函数根据种群大小popsize和权值阈值数量numweightsthresholds,随机生成初始种群,每个个体就是一组权值和阈值。selection函数通过计算适应度值的选择概率,随机选择个体组成新种群。crossover函数以一定交叉率crossover_rate,随机选择交叉点,对两个父代个体进行交叉产生子代。

3. 粒子群算法(PSO)优化

粒子群算法模拟鸟群觅食行为,每个粒子在解空间中飞行,通过追踪自身最优位置和全局最优位置,不断调整速度和位置,寻找最优解。

部分PSO代码示例

import numpy as np

# 初始化粒子
def initialize_particles(num_particles, num_weights_thresholds):
    particles = np.random.rand(num_particles, num_weights_thresholds)
    velocities = np.zeros((num_particles, num_weights_thresholds))
    personal_best = particles.copy()
    personal_best_fitness = np.array([float('inf')] * num_particles)
    return particles, velocities, personal_best, personal_best_fitness

# 更新粒子位置和速度
def update_particles(particles, velocities, personal_best, personal_best_fitness, global_best, w, c1, c2):
    r1 = np.random.rand(*particles.shape)
    r2 = np.random.rand(*particles.shape)
    velocities = w * velocities + c1 * r1 * (personal_best - particles) + c2 * r2 * (global_best - particles)
    particles = particles + velocities
    return particles, velocities

代码分析

initializeparticles函数初始化粒子位置particles、速度velocities、个体最优位置personalbest及对应的适应度personalbestfitnessupdate_particles函数根据惯性权重w、学习因子c1c2,以及随机数r1r2来更新粒子的速度和位置。

4. 构建回归预测模型

将GA或PSO优化得到的最优权值和阈值反向输入到BP神经网络,构建回归预测模型。

部分BP神经网络代码示例(简单示意,未完整实现)

class SimpleBP:
    def __init__(self, input_size, hidden_size, output_size):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.weights1 = np.random.rand(self.input_size, self.hidden_size)
        self.weights2 = np.random.rand(self.hidden_size, self.output_size)
        self.bias1 = np.zeros((1, self.hidden_size))
        self.bias2 = np.zeros((1, self.output_size))

    def forward_propagation(self, X):
        self.hidden_layer = sigmoid(np.dot(X, self.weights1) + self.bias1)
        self.output_layer = sigmoid(np.dot(self.hidden_layer, self.weights2) + self.bias2)
        return self.output_layer

代码分析

SimpleBP类初始化BP神经网络的结构和初始权值、阈值。forward_propagation函数实现前向传播,先计算隐藏层输出,再得到最终输出层输出,这里用sigmoid函数作为激活函数(代码未给出sigmoid函数实现)。

5. 评价指标打印

模型训练好后,要看看效果怎么样,这就需要打印多个评价指标,除了前面提到的MSE,还常用均方根误差(RMSE)、平均绝对误差(MAE)等。

代码示例(计算RMSE和MAE)

def calculate_rmse(y_true, y_pred):
    return np.sqrt(calculate_mse(y_true, y_pred))

def calculate_mae(y_true, y_pred):
    return np.mean(np.abs(y_true - y_pred))

代码分析

calculatermse函数就是在MSE基础上开个根号。calculatemae函数计算真实值和预测值差的绝对值的均值,衡量预测值误差的平均幅度。

利用遗传算法GA和粒子群算法PSO优化算法,将BP神经网络训练集的MSE作为适应度函数,获取最优的权值和阈值在反向输入到BP神经网络里构建回归预测模型,同时能够打印出模型的多个评价指标,具体效果可以看图

最后,通过GA和PSO对BP神经网络权值和阈值的优化,构建的回归预测模型在精度上往往会有不错的提升,具体效果可以结合实际数据和生成的图来观察。大家可以根据实际需求,进一步调整优化算法的参数和BP神经网络的结构,以获得更好的预测效果。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐