RBF(径向基神经网络)基础解析与代码实例:拟合任意函数

目录

[1. 前言](#1. 前言)

[2. RBF神经网络原理](#2. RBF神经网络原理)

[2.1 网络结构](#2.1 网络结构)

[2.2 激活函数](#2.2 激活函数)

[2.3 工作原理](#2.3 工作原理)

[3. RBF神经网络实例:拟合任意函数](#3. RBF神经网络实例:拟合任意函数)

[3.1 导入所需的库](#3.1 导入所需的库)

[3.2 定义RBF网络架构](#3.2 定义RBF网络架构)

[3.3 初始化网络参数](#3.3 初始化网络参数)

[3.4 定义损失函数和优化器](#3.4 定义损失函数和优化器)

[3.5 生成训练数据](#3.5 生成训练数据)

[3.6 训练模型](#3.6 训练模型)

[3.7 小批量梯度下降(可选)](#3.7 小批量梯度下降(可选))

[3.8 可视化结果](#3.8 可视化结果)

[3.9 完整代码](#3.9 完整代码)

[4. RBF应用领域](#4. RBF应用领域)

[5. 总结](#5. 总结)


1. 前言

目前RBF这一强大工具已经被基本证实可以拟合任意函数!

在机器学习领域,神经网络是一种强大的工具,用于解决各种复杂问题。其中,径向基函数(RBF,Radial Basis Function)神经网络以其独特的结构和优异的性能,在非线性函数逼近、模式识别等领域表现尤为突出。RBF神经网络是一种前馈神经网络,其隐含层节点的激活函数采用径向基函数,具有更强的局部逼近能力和更快的收敛速度。

2. RBF神经网络原理

2.1 网络结构

BF神经网络通常由三层组成:输入层、隐含层和输出层。输入层接收输入数据,隐含层使用径向基函数对输入数据进行变换,输出层则对隐含层的输出进行线性组合,得到最终的输出结果。

与MLP神经网络不同的是,其中每个x输入的不是一个特征,而是一整个样本 。

2.2 激活函数

隐含层的激活函数通常选用高斯函数,其表达式为:

这里,x是输入向量,ci​是第i个隐含层节点的中心,σi​是第i个隐含层节点的宽度。

径向基函数是一个取值仅仅依赖于离原点距离的实值函数(RBF)方法,任意一个满足该特性的函数都叫做径向基函数,标准的一般使用欧式距离(也叫做欧式径向基函数)。

2.3 工作原理

RBF神经网络的工作原理可以分为两个阶段。在训练阶段,网络通过调整隐含层节点的中心和宽度来拟合训练数据;在预测阶段,网络使用训练好的参数对新数据进行预测。

3. RBF神经网络实例:拟合任意函数

3.1 导入所需的库

首先,我们需要导入Pytorch和其他的基本库。

python 复制代码
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt

3.2 定义RBF网络架构

接下来,我们定义RBF网络的结构。在此示例中,我们将使用一层RBF中心和一层输出层。

python 复制代码
class RBFNetwork(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(RBFNetwork, self).__init__()
        self.hidden_dim = hidden_dim
        self.centers = nn.Parameter(torch.randn(hidden_dim, input_dim))
        self.sigmas = nn.Parameter(torch.randn(hidden_dim))
        self.linear = nn.Linear(hidden_dim, output_dim)
    
    def forward(self, x):
        x = x.unsqueeze(0)
        centers = self.centers.unsqueeze(1)
        distances = torch.sum((x - centers) ** 2, dim=2)
        rbf_activations = torch.exp(-distances / (2 * self.sigmas ** 2))
        return self.linear(rbf_activations)

增加一个维度,将输入张量的形状从 (batch_size, input_dim) 转换为 (1, batch_size, input_dim)

增加一个维度,将中心点张量的形状从 (hidden_dim, input_dim) 转换为 (hidden_dim, 1, input_dim)

通过广播机制,计算输入数据与每个中心点之间的差值。

torch.sum(..., dim=2):沿着第三个维度(dim=2)求和,得到每个输入点与每个中心点之间的欧几里得距离的平方。

rbf_activations 的形状是 (hidden_dim, batch_size),表示每个输入点在每个RBF单元的激活值。

self.linear 是一个全连接层,将输入从 hidden_dim 维度转换为 output_dim 维度。

结果 :返回一个形状为 (batch_size, output_dim) 的张量,表示网络的最终输出。

3.3 初始化网络参数

创建一个RBF网络实例,并初始化网络参数。

python 复制代码
input_dim = 1
hidden_dim = 10
output_dim = 1

rbf_net = RBFNetwork(input_dim, hidden_dim, output_dim)

3.4 定义损失函数和优化器

选择一个损失函数和优化器,常用的有均方误差损失和Adam优化器。

python 复制代码
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(rbf_net.parameters(), lr=0.01)

3.5 生成训练数据

生成一些简单的训练数据,用于训练RBF网络。

python 复制代码
x = torch.linspace(-5, 5, 100).reshape(-1, 1)
y = 2 * x ** 2 + 3 * x + 1

3.6 训练模型

使用生成的数据对模型进行训练,并记录损失值。

python 复制代码
num_epochs = 1000

for epoch in range(num_epochs):
    optimizer.zero_grad()
    outputs = rbf_net(x)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()
    
    if (epoch+1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')

这种训练方式称为 全批量梯度下降。

3.7 小批量梯度下降(可选)

如果你希望每次迭代只使用一部分数据(小批量)进行训练,可以使用 小批量梯度下降 。这通常通过 DataLoader 来实现,将数据集分成多个小批次,每次迭代只传递一个小批次的数据。

以下是使用 DataLoader 实现小批量梯度下降的示例:

python 复制代码
from torch.utils.data import DataLoader, TensorDataset

# 创建数据集
dataset = TensorDataset(x, y)
# 创建数据加载器,设置批量大小为32
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

for epoch in range(num_epochs):
    for batch_x, batch_y in dataloader:
        optimizer.zero_grad()
        outputs = rbf_net(batch_x)
        loss = criterion(outputs, batch_y)
        loss.backward()
        optimizer.step()

在这个示例中,每次迭代只传递一个小批次的数据(32个样本),并且数据会在每个 epoch 开始时被打乱(shuffle=True),以确保每次迭代使用不同的数据。

3.8 可视化结果

通过可视化训练数据和预测结果,评估模型的性能。

python 复制代码
plt.scatter(x.detach().numpy(), y.detach().numpy(), label='True function')
plt.plot(x.detach().numpy(), rbf_net(x).detach().numpy(), label='Approximated function')
plt.xlabel('x')
plt.ylabel('y')
plt.title('RBF Neural Network for Function Approximation')
plt.legend()
plt.show()

3.9 完整代码

完整代码如下方便调试:

python 复制代码
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt


class RBFNetwork(nn.Module):
    def __init__(self, input_dim, hidden_dim, output_dim):
        super(RBFNetwork, self).__init__()
        self.hidden_dim = hidden_dim
        self.centers = nn.Parameter(torch.randn(hidden_dim, input_dim))
        self.sigmas = nn.Parameter(torch.randn(hidden_dim))
        self.linear = nn.Linear(hidden_dim, output_dim)

    def forward(self, x):
        x = x.unsqueeze(0)  # 形状变为 (1, batch_size, input_dim)
        centers = self.centers.unsqueeze(1)  # 形状变为 (hidden_dim, 1, input_dim)
        distances = torch.sum((x - centers) ** 2, dim=2)  # 形状变为 (hidden_dim, batch_size)

        # 调整分母的形状以正确广播
        sigmas_sq = self.sigmas ** 2
        sigmas_sq = sigmas_sq.unsqueeze(1)  # 形状变为 (hidden_dim, 1)
        denominator = 2 * sigmas_sq

        rbf_activations = torch.exp(-distances / denominator)
        rbf_activations = rbf_activations.t()  # 转置为 (batch_size, hidden_dim)
        return self.linear(rbf_activations)


input_dim = 1
hidden_dim = 10
output_dim = 1

rbf_net = RBFNetwork(input_dim, hidden_dim, output_dim)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(rbf_net.parameters(), lr=0.01)

x = torch.linspace(-5, 5, 100).reshape(-1, 1)
y = 2 * x ** 2 + 3 * x + 1

num_epochs = 1000

for epoch in range(num_epochs):
    optimizer.zero_grad()
    outputs = rbf_net(x)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')

plt.scatter(x.detach().numpy(), y.detach().numpy(), label='True function')
plt.plot(x.detach().numpy(), rbf_net(x).detach().numpy(), label='Approximated function')
plt.xlabel('x')
plt.ylabel('y')
plt.title('RBF Neural Network for Function Approximation')
plt.legend()
plt.show()

4. RBF应用领域

  1. 函数逼近

RBF网络在非线性函数逼近方面表现出色,可以用于拟合复杂的函数关系。例如:

  • 回归分析:预测连续值,如房价、股票价格等。

  • 数学建模:拟合复杂的数学函数。

  1. 模式识别

RBF网络可以用于分类任务,识别模式或类别。例如:

  • 图像识别:识别手写数字、物体分类等。

  • 语音识别:识别语音信号中的模式。

  • 生物特征识别:如指纹识别、面部识别等。

  1. 时间序列预测

RBF网络可以用于预测时间序列数据,例如:

  • 股票市场预测:预测股票价格的未来走势。

  • 天气预测:预测未来的天气状况。

  • 销售预测:预测产品销量。

  1. 控制系统

RBF网络可以用于设计智能控制系统,例如:

  • 机器人控制:控制机器人的运动和行为。

  • 自动驾驶:用于自动驾驶汽车的路径规划和决策。

  • 工业过程控制:优化工业生产过程。

  1. 数据分类与聚类

RBF网络可以用于数据分类和聚类任务,例如:

  • 客户分类:根据客户行为或特征进行分类。

  • 异常检测:识别异常数据点,如信用卡欺诈检测。

  1. 信号处理

RBF网络可以用于信号处理任务,例如:

  • 噪声滤波:去除信号中的噪声。

  • 信号分类:识别不同类型的信号,如心电信号(ECG)分类。

  1. 生物信息学

RBF网络在生物信息学中有广泛应用,例如:

  • 基因表达分析:分析基因表达数据。

  • 蛋白质结构预测:预测蛋白质的三维结构。

  1. 金融领域

RBF网络在金融领域也有广泛应用,例如:

  • 信用评分:评估客户的信用风险。

  • 投资组合优化:优化投资组合的配置。

  1. 自然语言处理

RBF网络可以用于自然语言处理任务,例如:

  • 情感分析:分析文本中的情感倾向。

  • 文本分类:对文本进行分类,如新闻分类。

  1. 游戏AI

RBF网络可以用于游戏AI,例如:

  • 行为预测:预测玩家的行为。

  • 策略优化:优化游戏中的策略和决策。

5. 总结

在这篇文章里,我们详细地介绍了RBF神经网络的原理,并通过Pytorch实现了一个简单的RBF网络。通过每一步的代码示例和注释,我们展示了如何构建和训练RBF网络。RBF网络具有独特的结构和优异的性能,在非线性函数逼近和模式识别等领域有着广泛的应用。希望这篇文章能帮助大家顺利理解和实现RBF神经网络。我是橙色小博,关注我,一起在人工智能领域学习进步!

相关推荐
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab1 天前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab1 天前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP1 天前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年1 天前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼1 天前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS1 天前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区1 天前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈1 天前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang1 天前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx