文章目录
目录
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、径向基的神经网络是什么?
基于径向基的神经网络(Radial Basis Function Neural Network,RBFNN)是一种经典的人工神经网络模型,它在模式识别、函数逼近和预测等领域具有广泛应用。RBFNN以其独特的结构和强大的学习能力而受到广泛关注。
RBFNN的核心思想是通过将输入数据映射到高维特征空间中,并在该空间中使用径向基函数来建模和拟合数据。这些径向基函数以输入与其心脏(或中心)之间的距离作为激活函数,表达了数据与特定中心之间的相关性。通过适当选择径向基函数的中心位置和宽度,RBFNN可以有效地逼近复杂的非线性关系。
RBFNN的学习过程包括两个主要阶段:中心选择和权重调整。中心选择阶段通过一定的方法从训练数据中选择一组合适的中心点,这些中心点代表了特征空间中的数据分布。权重调整阶段使用最小均方误差或最大似然估计等方法,通过调整径向基函数的权重,使得网络能够更好地逼近目标函数。
RBFNN具有多个优点。首先,它具有较好的泛化能力,可以处理高维数据和复杂的非线性关系。其次,RBFNN的训练过程相对简单且具有较快的收敛速度。此外,RBFNN还具备一定的容错性,对于输入数据中的噪声和异常值具有一定的鲁棒性。
总而言之,基于径向基的神经网络是一种强大的工具,可用于模式识别、函数逼近、时间序列预测等各种应用领域。其独特的结构和学习算法使得它成为处理复杂问题的有效方法,并在实际应用中取得了显著的成果。随着深度学习等技术的不断发展,RBFNN仍然具备着重要的研究和应用价值。
二、使用步骤
1.导入数据(时间序列只能是单列)
%% 导入数据(时间序列的单列数据)
result = xlsread("C:\Users\86182\Desktop\时间序列\银行.xlsx");
result =result(:,3)
2.数据分析
num_samples = length(result); % 样本个数
kim = 20; % 延时步长(kim个历史数据作为自变量)
zim = 1; % 跨zim个时间点进行预测
延时步长可调,检验预测未来数据的个数多少,这里填多少。
3.构造数据集
%% 构造数据集
for i = 1: num_samples - kim - zim + 1
res(i, :) = [reshape(result(i: i + kim - 1), 1, kim), result(i + kim + zim - 1)];
end
[m,n]=size(res)
4.划分训练集和测试集
temp = 1: 1: m;
round(m*0.7)
P_train = res(temp(1:round(m*0.7)), 1:20)';
T_train = res(temp(1:round(m*0.7)), 21)';
M = size(P_train, 2);
P_test = res(temp(round(m*0.7)+1: end), 1:20)';
T_test = res(temp(round(m*0.7)+1: end), 21)';
N = size(P_test, 2);
5.数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
6.创建网络
rbf_spread = 1000; % 径向基函数的扩展速度
net = newrbe(p_train, t_train,rbf_spread);
7.仿真测试
t_sim1 = sim(net, p_train);
t_sim2 = sim(net, p_test );
8.数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
9.绘图
%% 均方根误差
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);
%% 绘图
figure
plot(1: M, T_train, 'r-', 1: M, T_sim1, 'b-', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid
figure
plot(1: N, T_test, 'r-', 1: N, T_sim2, 'b-', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比'; ['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid
10.模型评估
% R2
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2;
R2 = 1 - norm(T_test - T_sim2)^2 / norm(T_test - mean(T_test ))^2;
disp(['训练集数据的R1为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])
% MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;
mae2 = sum(abs(T_sim2 - T_test)) ./ N ;
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['测试集数据的MAE为:', num2str(mae2)])
% MBE
mbe1 = sum(T_sim1 - T_train) ./ M ;
mbe2 = sum(T_sim2 - T_test) ./ N ;
disp(['训练集数据的MBE为:', num2str(mbe1)])
disp(['测试集数据的MBE为:', num2str(mbe2)])
mse1 = sqrt(sum((T_sim1 - T_train).^2)) ./ M;
mse2 = sqrt(sum((T_sim2 - T_test).^2)) ./ N;
disp(['训练集数据的MSE1为:', num2str(mse1)])
disp(['测试集数据的MSE2为:', num2str(mse2)])
rmse1 = sqrt(mean((T_sim1 - T_train).^2));
rmse2 = sqrt(mean((T_sim2 - T_test).^2));
disp(['训练集数据的RMSE1为:', num2str(rmse1)])
disp(['测试集数据的RMSE2为:', num2str(rmse2)])
11.预测未来20天的股票价格
%%
save net.mat net
save ps_input.mat ps_input
save ps_output.mat ps_output
%%
%% 读取保存文件
load net.mat
load ps_input.mat
load ps_output.mat
%% 读取待预测数据
c=result(end-kim+1:end)'
d=zeros(20,1)'
f=[c d]
f(1)
for i=1:20
kes = f(i:19+i)
%0.51059 0.02007 4 2
%% 数据转置
kes = kes';
%% 数据归一化
n_test = mapminmax('apply', kes, ps_input);
%% 仿真测试
t_sim3 = sim(net, n_test);
%% 数据反归一化
T_sim3 = mapminmax('reverse', t_sim3, ps_output)
f(i+20)=T_sim3
end
[n1,m1]=size(T_test)
figure
hold on
plot(T_test , 'b-')
plot(m1+1:m1+21,f(20:21+19), 'r-')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
hold off
总结
可见基于径向基的神经网络的对股票的预测还是挺准的,CSDN中 很多文章只给测试集的预测效果,不给预测未来的数据,这篇文章也给出的未来的股票预测,不一定准确,因为股票价格受到很多因素的影响。仅作参考。