RBF算法

本文介绍了RBF神经网络的原理和训练过程,包括其作为局部逼近的特性以及与BP神经网络的区别。训练阶段分为无监督学习选择记忆样本和监督学习计算权重。无监督学习中提到了利用KMeans聚类算法选择中心点,而监督学习则可以结合BP算法或直接数学计算。此外,文中还涉及到RBF算法的代码实现,涵盖了KMeans、numpy.linespace和numpy.random等技术应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BP使用激活函数,全局逼近

RBF使用径向基函数,局部逼近

RBF神经网络训练分为两个阶段

1,无监督学习,从样本中选择记忆样本/中心点,可以使用聚类算法,也可以选择随机给定的方式

2,监督学习,计算样本经过rbf转换后,和输出的关系/权重,可以使用bp算法,也可以使用简单的数学公式计算

关于RBF算法的代码实践

用到的技术点:Kmeans算法 numpy.linespace  numpy.random使用

# -- encoding:utf-8 --
"""
Create by ibf on 2018/5/8
"""

from scipy.linalg import norm, pinv
import numpy as np

from matplotlib import pyplot as plt

from sklearn.cluster import KMeans

np.random.seed(28)


# TODO: 基于TensorFlow实现实现一下RBF神经网络的结构。

class RBF:
    """
    RBF径向基神经网络
    """

    def __init__(self, input_dim, num_centers, out_dim):
        """
        初始化函数
        :param input_dim: 输入维度数目
        :param num_centers: 中间的核数目
        :param out_dim:输出维度数目
        """
        self.input_dim = input_dim
        self.out_dim = out_dim
        self.
共有七个完整算法 % 1.基于聚类的RBF 网设计算法 % 一维输入,一维输出,逼近效果很好! SamNum = 100; % 总样本数 TestSamNum = 101; % 测试样本数 InDim = 1; % 样本输入维数 ClusterNum = 10; % 隐节点数,即聚类样本数 Overlap = 1.0; % 隐节点重叠系数 % 根据目标函数获得样本输入输出 rand('state',sum(100*clock)) NoiseVar = 0.1; Noise = NoiseVar*randn(1,SamNum); SamIn = 8*rand(1,SamNum)-4; SamOutNoNoise = 1.1*(1-SamIn+2*SamIn.^2).*exp(-SamIn.^2/2); SamOut = SamOutNoNoise + Noise; TestSamIn = -4:0.08:4; TestSamOut = 1.1*(1-TestSamIn+2*TestSamIn.^2).*exp(-TestSamIn.^2/2); figure hold on grid plot(SamIn,SamOut,'k+') plot(TestSamIn,TestSamOut,'r--') xlabel('Input x'); ylabel('Output y'); Centers = SamIn(:,1:ClusterNum); NumberInClusters = zeros(ClusterNum,1); % 各类中的样本数,初始化为零 IndexInClusters = zeros(ClusterNum,SamNum); % 各类所含样本的索引号 while 1, NumberInClusters = zeros(ClusterNum,1); % 各类中的样本数,初始化为零 IndexInClusters = zeros(ClusterNum,SamNum); % 各类所含样本的索引号 % 按最小距离原则对所有样本进行分类 for i = 1:SamNum AllDistance = dist(Centers',SamIn(:,i)); [MinDist,Pos] = min(AllDistance); NumberInClusters(Pos) = NumberInClusters(Pos) + 1; IndexInClusters(Pos,NumberInClusters(Pos)) = i; end % 保存旧的聚类中心 OldCenters = Centers; for i = 1:ClusterNum Index = IndexInClusters(i,1:NumberInClusters(i)); Centers(:,i) = mean(SamIn(:,Index)')'; end % 判断新旧聚类中心是否一致,是则结束聚类 EqualNum = sum(sum(Centers==OldCenters)); if EqualNum == InDim*ClusterNum, break, end end % 计算各隐节点的扩展常数(宽度) AllDistances = dist(Centers',Centers); % 计算隐节点数据中心间的距离(矩阵) Maximum = max(max(AllDistances)); % 找出其中最大的一个距离 for i = 1:ClusterNum % 将对角线上的0 替换为较大的值 AllDistances(i,i) = Maximum+1; end Spreads = Overlap*min(AllDistances)'; % 以隐节点间的最小距离作为扩展常数 % 计算各隐节点的输出权值 Distance = dist(Centers',SamIn); % 计算各样本输入离各数据中心的距离 SpreadsMat = repmat(Spreads,1,SamNum); HiddenUnitOut = radbas(Distance./SpreadsMat); % 计算隐节点输出阵 HiddenUnitOutEx = [HiddenUnitOut' ones(SamNum,1)]'; % 考虑偏移 W2Ex = SamOut*pinv(HiddenUnitOutEx); % 求广义输出权值 W2 = W2Ex(:,1:ClusterNum); % 输出权值 B2 = W2Ex(:,ClusterNum+1); % 偏移 % 测试 TestDistance = dist(Centers',TestSamIn); TestSpreadsMat = repmat(Spreads,1,TestSamNum); TestHiddenUnitOut = radbas(TestDistance./TestSpreadsMat); TestNNOut = W2*TestHiddenUnitOut+B2; plot(TestSamIn,TestNNOut,'b-') W2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值