PSO优化BP神经网络初探

粒子群优化算法(PSO)是一种基于种群的全局优化算法,用于寻找函数的全局最优解。它基于模拟鸟群或鱼群寻找食物的行为的思想。群体中的每个粒子代表一个候选解,并根据自身的经验和相邻的经验更新其在搜索空间中的位置。表现最佳的粒子,即全局最佳粒子,用于指导整个群体的搜索。

反向传播算法(BP)是一种用于训练人工神经网络的监督学习算法。它是一种基于梯度的优化方法,用于调整网络的权重,以最小化预测输出与实际目标之间的误差。误差被计算并通过网络反向传播,从而使得权重可以在下一次迭代中被更新,以减少误差。BP被用于各种应用,例如图像识别、自然语言处理和控制系统。

下面将使用sk包的PSO来优化BP神经网络。

1. 加载包

import numpy as np
from sko.PSO import PSO
import matplotlib.pyplot as plt

2.定义激活函数

import numpy as np
from sko.PSO import PSO
import matplotlib.pyplot as plt

3.定义BP神经网络

class BP_Neural_Network:
    def __init__(self, input_size, hidden_size, output_size):
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        # Initialize the weight matrices
        self.W1 = np.random.randn(self.input_size, self.hidden_size)
        self.W2 = np.random.randn(self.hidden_size, self.output_size)
        
    def forward(self, X):
        self.z = np.dot(X, self.W1)
        self.z2 = sigmoid(self.z)
        self.z3 = np.dot(self.z2, self.W2)
        o = sigmoid(self.z3)
        return o
    
    def backward(self, X, y, o):
        self.o_error = y - o
        self.o_delta = self.o_error * sigmoid_derivative(o)
        self.z2_error = self.o_delta.dot(self.W2.T)
        self.z2_delta = self.z2_error * sigmoid_derivative(self.z2)
        self.W1 += X.T.dot(self.z2_delta)
        self.W2 += self.z2.T.dot(self.o_delta)
        
    def train(self, X, y):
        o = self.forward(X)
        self.backward(X, y, o)
        
    def predict(self, X):
        return self.forward(X)

4.定义优化目标

def obj_func(weights):
    nn.W1 = weights[0:3 * 2].reshape((3, 2))
    nn.W2 = weights[3 * 2:].reshape((2, 1))
    y_pred = nn.predict(X_train)
    return np.mean(np.power(y_train - y_pred, 2))

5.初始化设置

nn = BP_Neural_Network(input_size=3, hidden_size=2, output_size=1)
X_train = np.array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
y_train = np.array([[0], [1], [1], [0]])
pso = PSO(func=obj_func, n_dim=3 * 2 + 2, lb=[-10, -10, -10, -10, -10, -10, -10, -10], ub=[10, 10, 10, 10, 10, 10, 10, 10], pop=30, max_iter=100)

6.运行PSO获取最佳权重偏置

pso.run()
nn.W1 = pso.gbest_x[0:3 * 2].reshape((3, 2))
nn.W2 = pso.gbest_x[3 * 2:].reshape((2, 1))

7.预测

nn.W1 = pso.gbest_x[0:3 * 2].reshape((3, 2))
nn.W2 = pso.gbest_x[3 * 2:].reshape((2, 1))

Predicted outputs: [[5.19002550e-05]
[9.99948100e-01]
[9.99948101e-01]
[5.19000440e-05]]

8.画图展示

plt.plot(pso.gbest_y_hist)
plt.xlabel('Iteration')
plt.ylabel('Mean Squared Error')
plt.show()

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zypiverson001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值