基于近似径向基函数神经网络(RBF)的时间序列预测 RBF时间序列 matlab代码 注
最近在折腾时间序列预测的项目,发现径向基函数神经网络(RBFNN)用起来挺有意思。这玩意儿不像普通前馈网络那么死板,核心在于用径向基函数做隐层激活,对非线性的时间序列数据适应性强。这里有个坑要注意:k-means对初始值敏感,可能导致每次结果不一致。和普通神经网络不同,RBF的隐层节点通常用高斯函数激活,而且中心点的选择直接影响性能。这里有个小技巧:时间序列预测的关键在于构建输入输出对。这个实现虽
基于近似径向基函数神经网络(RBF)的时间序列预测 RBF时间序列 matlab代码 注:暂无Matlab版本要求 -- 推荐 2018B 版本及以上

最近在折腾时间序列预测的项目,发现径向基函数神经网络(RBFNN)用起来挺有意思。这玩意儿不像普通前馈网络那么死板,核心在于用径向基函数做隐层激活,对非线性的时间序列数据适应性强。今天咱们用Matlab整活一个极简版实现,手把手看看怎么玩转这个套路。

先搞点模拟数据开胃。假设我们要预测的是正弦波叠加随机噪声的时间序列:
% 生成带噪声的正弦波
t = 0:0.1:20;
y = sin(t) + 0.2*randn(size(t));
lag = 5; % 用前5个点预测下一个点
这里有个小技巧:时间序列预测的关键在于构建输入输出对。我们需要把时序数据切成滑动窗口:
% 构造训练数据
inputs = zeros(lag, length(t)-lag);
targets = zeros(1, length(t)-lag);
for i = 1:length(t)-lag
inputs(:,i) = y(i:i+lag-1);
targets(i) = y(i+lag);
end
接下来是RBF网络的核心部分。和普通神经网络不同,RBF的隐层节点通常用高斯函数激活,而且中心点的选择直接影响性能。这里偷个懒直接用k-means聚类确定中心:
% 设置RBF参数
hiddenSize = 15; % 隐层节点数
[centers, ~] = kmeans(inputs', hiddenSize); % k-means找中心点
sigma = 0.8; % 高斯核宽度
% 计算隐层输出
dist = pdist2(inputs', centers); % 计算输入到各中心的距离
hiddenOut = exp(-dist.^2/(2*sigma^2)); % 高斯激活
这里有个坑要注意:k-means对初始值敏感,可能导致每次结果不一致。如果数据量不大,可以多跑几次选最优的。sigma参数控制核函数的平滑程度,调这个能显著影响模型表现。

输出层就是简单的线性组合,用正则化防止过拟合:
% 训练输出层权重
lambda = 0.01; % 正则化系数
W = (hiddenOut' * hiddenOut + lambda*eye(hiddenSize)) \ (hiddenOut' * targets');
预测阶段的操作和训练时类似,但要注意用训练好的中心点和sigma值:
% 预测函数
predict = @(x) exp(-pdist2(x', centers).^2/(2*sigma^2)) * W;
为了验证效果,咱们做个滚动预测。用前lag个点预测下一个点,然后把预测值作为输入继续预测:
% 滚动预测
test_input = inputs(:,1);
pred_sequence = zeros(1,50);
for i = 1:50
pred = predict(test_input);
pred_sequence(i) = pred;
test_input = [test_input(2:end); pred]; % 更新输入窗口
end
最后画个对比图看看效果:
figure
plot(t(1:50+lag), y(1:50+lag), 'b-', 'LineWidth', 1.5)
hold on
plot(t(lag+1:lag+50), pred_sequence, 'r--', 'LineWidth', 1.2)
legend('真实值', '预测值')
title('RBF时间序列预测效果')
xlabel('时间步')
ylabel('数值')
几个调参经验:
- 隐层节点数建议取输入维度的1.5-3倍
- 当预测出现滞后现象时,适当增大sigma值
- 数据噪声大时增加正则化系数lambda
- 时序突变剧烈时可能需要动态调整中心点
这个实现虽然简陋,但跑个简单的时间序列预测基本够用。想要提升效果可以尝试:
- 用正交最小二乘筛选中心点
- 加入时间特征(如周期性指标)
- 混合ARIMA等传统方法
完整代码可以到我的GitHub仓库扒拉(假装有链接)。下回咱们聊聊怎么用变分模态分解配合RBF处理非平稳序列,保准比现在这个更带劲!


更多推荐
所有评论(0)