资源简介

内含SVM(支持向量机)算法的实现回归拟合,以混凝土抗压强度预测为例,含具体代码注释

资源截图

代码片段和文件信息

%% 支持向量机的回归拟合——混凝土抗压强度预测


%% 清空环境变量
clear all
clc

%% 导入数据
load concrete_data.mat
% 随机产生训练集和测试集
n = randperm(size(attributes2));
% 训练集——80个样本
p_train = attributes(:n(1:80))‘;
t_train = strength(:n(1:80))‘;
% 测试集——23个样本
p_test = attributes(:n(81:end))‘;
t_test = strength(:n(81:end))‘;

%% 数据归一化

% 训练集
[pn_traininputps] = mapminmax(p_train‘);
pn_train = pn_train‘;
pn_test = mapminmax(‘apply‘p_test‘inputps);
pn_test = pn_test‘;
% 测试集
[tn_trainoutputps] = mapminmax(t_train‘);
tn_train = tn_train‘;
tn_test = mapminmax(‘apply‘t_test‘outputps);
tn_test = tn_test‘;

%% SVM模型创建/训练

% 寻找最佳c参数/g参数
[cg] = meshgrid(-10:0.5:10-10:0.5:10);
[mn] = size(c);
cg = zeros(mn);
eps = 10^(-4);
v = 5;
bestc = 0;
bestg = 0;
error = Inf;
for i = 1:m
    for j = 1:n
        cmd = [‘-v ‘num2str(v)‘ -t 2‘‘ -c ‘num2str(2^c(ij))‘ -g ‘num2str(2^g(ij) )‘ -s 3 -p 0.1‘];
        cg(ij) = svmtrain(tn_trainpn_traincmd);
        if cg(ij) < error
            error = cg(ij);
            bestc = 2^c(ij);
            bestg = 2^g(ij);
        end
        if abs(cg(ij) - error) <= eps && bestc > 2^c(ij)
            error = cg(ij);
            bestc = 2^c(ij);
            bestg = 2^g(ij);
        end
    end
end
% 创建/训练SVM  
cmd = [‘ -t 2‘‘ -c ‘num2str(bestc)‘ -g ‘num2str(bestg)‘ -s 3 -p 0.01‘];
model = svmtrain(tn_trainpn_traincmd);

%% SVM仿真预测
[Predict_1error_1] = svmpredict(tn_trainpn_trainmodel);
[Predict_2error_2] = svmpredict(tn_testpn_testmodel);
% 反归一化
predict_1 = mapminmax(‘reverse‘Predict_1outputps);
predict_2 = mapminmax(‘reverse‘Predict_2outputps);
% 结果对比
result_1 = [t_train predict_1];
result_2 = [t_test predict_2];

%% 绘图
figure(1)
plot(1:length(t_train)t_train‘r-*‘1:length(t_train)predict_1‘b:o‘)
grid on
legend(‘真实值‘‘预测值‘)
xlabel(‘样本编号‘)
ylabel(‘耐压强度‘)
string_1 = {‘训练集预测结果对比‘;
           [‘mse = ‘ num2str(error_1(2)) ‘ R^2 = ‘ num2str(error_1(3))]};
title(string_1)
figure(2)
plot(1:length(t_test)t_test‘r-*‘1:length(t_test)predict_2‘b:o‘)
grid on
legend(‘真实值‘‘预测值‘)
xlabel(‘样本编号‘)
ylabel(‘耐压强度‘)
string_2 = {‘测试集预测结果对比‘;
           [‘mse = ‘ num2str(error_2(2)) ‘ R^2 = ‘ num2str(error_2(3))]};
title(string_2)

%% BP 神经网络

% 数据转置
pn_train = pn_train‘;
tn_train = tn_train‘;
pn_test = pn_test‘;
tn_test = tn_test‘;
% 创建BP神经网络
net = newff(pn_traintn_train10);
% 设置训练参数
net.trainParam.epcohs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.show = 10;
net.trainParam.lr = 0.1;
% 训练网络
net = train(netpn_traintn_train);
% 仿真测试
tn_sim = sim(netpn_test);
% 均方误差
E = mse(tn_sim - tn_test);
% 决定系数
N = size(t_test1);
R2=(N*sum(tn_sim.*tn_test)-sum(tn_sim)*sum(tn_test))^2/((N*sum((tn_sim).^2)-(sum(tn_sim))^2)*(N*sum((tn_test).^2)-(sum(tn_test))^2)); 
% 反归一化
t_sim = mapminmax(‘reverse‘tn_simoutputps);
% 绘图
figure(3)
plot(1:length(t_test)t_test‘r-*‘1:length(t_test)t_sim‘b:o‘)
grid on
legend(‘真实值‘‘预测

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        2286  2019-08-14 16:01  支持向量机的回归拟合\concrete_data.mat
     文件        3364  2019-08-26 12:08  支持向量机的回归拟合\main.m
     目录           0  2019-08-26 12:08  支持向量机的回归拟合\

评论

共有 条评论