• 粒子群算法(PSO)优化RBF神经网络实践


    算法原理及流程

    关于RBF神经网络的细节详见:RBF神经网络学习及实践

    关于PSO算法的细节详见:粒子群优化算法(PSO)python实践

    PSO算法优化RBF神经网络训练流程图如下所示。
    在这里插入图片描述

    代码实现

    代码直接使用文章RBF神经网络学习及实践粒子群优化算法(PSO)python实践中的代码框架。

    为了能在PSO类内部计算fitness,我们给PSO类初始化方法添加rbfn参数,方便调用rbfn进行训练和计算适应度(适应度直接采用均方误差)。

    self.rbfn = rbfN
    
    • 1

    修改RBFN类中的训练测试函数,使之返回适应度。

    def test(self):
    G = self._calcAct(self.X)
    Y_pre = np.dot(G, self.W)
    # 计算整体均方误差
    E = 0.5 * (np.linalg.norm(Y_pre - self.Y)) ** 2
    return E
    
    def predict(self, x):
    G = self._calcAct(x)
    Y_pre = np.dot(G, self.W)
    return Y_pre
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    测试主函数

    num_sample, num_center, sample_dim = 30, 3, 1
    # 数据生成
    x_train = np.linspace(-4, 4, num_sample).reshape(-1, 1)
    y_train = np.multiply(1.1 * (1 - x_train + 2 * x_train ** 2), np.exp(-0.5 * x_train ** 2))
    x_test = np.linspace(-4, 4, 500).reshape(-1, 1)
    y_test = np.multiply(1.1 * (1 - x_test + 2 * x_test ** 2), np.exp(-0.5 * x_test ** 2))
    # PSO-RBF
    rbfn = RBFN(1, num_center, 1, x_train, y_train)
    pso = PSO_RBFN(num_center * sample_dim, 30, 400, rbfN = rbfn)
    pso.pso()
    # print(pso.g_best)
    rbfn.train(pso.g_best)
    y_pre = rbfn.predict(x_test)
    # 绘图
    plt.figure(1)
    plt.plot(x_test, y_pre, 'k')
    plt.plot(x_test, y_test, 'r:')
    plt.ylabel('y')
    plt.xlabel('x')
    for i in range(len(x_train)):
        plt.plot(x_train[i], y_train[i], 'go', markerfacecolor = 'none')
    plt.legend(labels = ['reconstruction', 'original', 'sample point'], loc = 'lower left')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    测试PSO适应度收敛曲线如下图所示。

    11133

    PSO-RBFN毕竟结果如下。

    Figu1

    其中绿色空心圆点为样本数据,红色虚线为期望数据,黑色实线为预测数据。

    结果分析与总结

    • PSO粒子与RBFN中心点

      这两个概念我曾混淆,认为:PSO优化RBFN时,每个中心点都编码成一个粒子。但是随后又想,既然在PSO中需要频繁计算每个粒子的适应度,而RBFN的预测结果是由所有中心点共同线性加权决定的,所以这个想法不成立。实际上,我们引入PSO算法的目的在于更好地优化RBFN,使其找到最优的网络构建参数:隐层中心点、方差、输出层到结果的权值。只要隐层中心点确定,方差可以由如下公式计算得到:

      σ = d max ⁡ 2 n \sigma=\frac{d_{\max }}{\sqrt{2 n}} σ=2n dmax
      这里 d max ⁡ \mathrm{d}_{\max } dmax 是选取中心的之间的最大距离。权值也可以通过伪逆法求解得到。

      image-20221109213729271

      因此,我们只需找到构建RBFN的最优中心点即可,即粒子编码中包括基函数中心值。设有 m m m 个中心点,每个中心点为 k k k 维(中心点维度等于输入样本数据维度),那么,每个粒子的位置和速度均为 m × k m\times{k} m×k 维。

    • 粒子位置限制和速度限制

      对于粒子的位置限制,取决于输入样本的各个维度的取值域,如果是取值无约束,可注释掉位置限制相关代码。对于速度限制,一般取最大速度取维度位置变化范围的10%~20%,在测试代码中粒子速度范围限制在[-1,1]之间。

    • RBFN中心点个数确定和初始化

      在测试代码中,对于RBFN中心点个数取3,且在 [ X m i n , X m a x ] [X_{min},X_{max}] [Xmin,Xmax] 中均匀随机初始化,这属于比较简单粗暴的了。正常来说,一般是使用聚类进行初始化。如指定中心点个数进行K-Means聚类得到聚类中心初始化中心点位置。但是K-Means算法的缺点是需要指定聚类中心个数,所以可以考虑采用减法聚类Subtrative Clustering迭代得到一定数量的聚类中心点位置。

    • 样本数据归一化

      对于样本数据的不同维度,其数据量纲、量纲单位、数量级存在差别,为防止计算饱和,需要对其进行归一化处理,以建立各类数据的可比性。

      • min-max标准化

        min-max标准化最终将样本数据限定在[0,1]范围内,其转化函数为:
        X = X − X m i n X m a x − X m i n X=\frac{X-X_{min}}{X_{max}-X_{min}} X=XmaxXminXXmin
        式中 X X X 为样本数据, X m a x X_{max} Xmax 为样本数据最大值, X m i n X_{min} Xmin 为最小值。

      • z-score标准化

        经过 z-score标准化处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为:
        z = x − μ σ z=\frac{x-\mu}{\sigma} z=σxμ
        其中 μ \mu μ 为样本数据的均值, σ \sigma σ 为样本数据的标准差, x x x 为样本数据。

    参考

    [1] 庹婧艺,徐冰峰,徐悦,等. 基于PSO算法优化的RBF神经网络水厂混凝投药控制[J]. 工业安全与环保,2022,48(9):83-86. DOI:10.3969/j.issn.1001-425X.2022.09.020.

  • 相关阅读:
    Cglib
    走廊上的相机安装及调试方法
    [pytorch笔记]04 --进阶训练技巧
    华为od机考题目-导师请吃火锅
    【洛谷题解/SDOI2012】P2303/SDOI2012 D1T1 Longge的问题
    二进制明文字符串加密:还原与反还原
    Linux操作系统(含命令大全)
    一文深度解读边缘计算产业发展前景
    VBA技术资料MF50:VBA_在Excel中突出显示前3个值
    百度飞浆EISeg高效交互式标注分割软件的使用教程
  • 原文地址:https://blog.csdn.net/qq_39784672/article/details/127779101