会陆续更新其他算法优化BP
%% 导入数据 res = xlsread('data.xlsx'); %% 数据分析 num_size = 0.7; % 训练集占数据集比例 outdim = 1; % 最后一列为输出 num_samples = size(res, 1); % 样本个数 load temp res = res(temp, :); % 打乱数据集(不希望打乱时,注释该行) num_train_s = round(num_size * num_samples); % 训练集样本个数 f_ = size(res, 2) - outdim; % 输入特征维度 %% 划分训练集和测试集 P_train = res(1: num_train_s, 1: f_)'; T_train = res(1: num_train_s, f_ + 1: end)'; M = size(P_train, 2); P_test = res(num_train_s + 1: end, 1: f_)'; T_test = res(num_train_s + 1: end, f_ + 1: end)'; N = size(P_test, 2); %% 数据归一化 [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); %% 节点个数 inputnum = size(p_train, 1); % 输入层节点数 hiddennum = 15; % 隐藏层节点数 outputnum = size(t_train, 1); % 输出层节点数 %% 构建网络 net = newff(p_train, t_train, hiddennum); %% 设置训练参数 net.trainParam.epochs = 50; % 训练次数 net.trainParam.goal = 1e-4; % 目标误差 net.trainParam.lr = 0.1; % 学习率 net.trainParam.showWindow = 0; % 关闭窗口 %% 参数设置 fun = @getObjValue; % 目标函数 dim = inputnum * hiddennum + hiddennum * outputnum + ... hiddennum + outputnum; % 优化参数个数 lb = -1 * ones(1, dim); % 优化参数目标下限 ub = 1 * ones(1, dim); % 优化参数目标上限 pop = 20; % 数量 Max_iteration = 20; % 最大迭代次数 %% 优化算法 [Best_score,Best_pos,curve] = ASFSSA(pop, Max_iteration, lb, ub, dim, fun); %% 把最优初始阀值权值赋予网络预测 w1 = Best_pos(1 : inputnum * hiddennum); B1 = Best_pos(inputnum * hiddennum + 1 : inputnum * hiddennum + hiddennum); w2 = Best_pos(inputnum * hiddennum + hiddennum + 1 : inputnum * hiddennum + hiddennum + hiddennum*outputnum); B2 = Best_pos(inputnum * hiddennum + hiddennum + hiddennum * outputnum + 1 : ... inputnum * hiddennum + hiddennum + hiddennum * outputnum + outputnum);
训练集数据的R2为:0.80792 测试集数据的R2为:0.89047 训练集数据的MAE为:20.9069 测试集数据的MAE为:20.211 训练集数据的RMSE为:29.1421 测试集数据的RMSE为:27.2051