SVM 支持向量机的回归拟合(matlab实现)( 二 )


此外,不少专家和学者将投影寻踪回归、神经网络、灰色理论等方法引入混凝土结构工程领域,取得了不错的效果,对混凝土抗压强度的预测有着一定的指导意义 。相关研究成果表明,混凝土的28天立方米抗压强度与混凝土的组成有很大的关系,即与每立方米混凝土中水泥、炉石、飞灰、水、超增塑剂、碎石及砂用量的多少有显著的关系 。现采集到103组混凝土样本的立方米抗压强度及其中上述7种成分的含量大小,要求利用支持向量机建立混凝土的28天立方米抗压强度与其组成间的回归数学模型,并对模型的性能进行评价 。
2.2 解题思路及步骤
依据问题描述中的要求,实现支持向量机回归模型的建立及性能评价,大体上可以分为以下几个步骤,如图29-4所示 。
1.产生训练集/测试集
与SVM分类中类似,为了满足软件包相关函数调用格式的要求,产生的训练集和测试集应进行相应的转换 。训练集样本的数量及代表性要求与其他方法相同,此处不再赘述 。
2.创建/训练SVR回归模型
利用软件包中的函数可以实现SVR回归模型的创建和训练,区别是其中的相关参数设置有所不同 。同时,考虑到归一化、核函数的类型、参数的取值对回归模型的性能影响较大,因此,需要在设计时综合衡量,具体参见第3节及第4节,此处不再赘述 。
3.仿真测试
利用软件包中的函数可以实现SVR回归模型的仿真测试,返回的第1个参数为对应的预测值,第2个参数中记录了测试集的均方误差E和决定系数R2,具体的计算公式分别如下:
4.性能评价
利用函数返回的均方误差E和决定系数R2,可以对所建立的SVR回归模型的性能进行评价 。若性能没有达到要求,则可以通过修改模型参数、核函数类型等方法重新建立回归模型,直到满足要求为止 。
3 程序实现
利用及软件包中提供的函数,可以方便地在环境下实现上述步骤 。
%% 清空环境变量clear allclc%% 导入数据load concrete_data.mat% 随机产生训练集和测试集n = randperm(size(attributes,2));% 训练集——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_train,inputps] = mapminmax(p_train');pn_train = pn_train';pn_test = mapminmax('apply',p_test',inputps);pn_test = pn_test';% 测试集[tn_train,outputps] = mapminmax(t_train');tn_train = tn_train';tn_test = mapminmax('apply',t_test',outputps);tn_test = tn_test';%% SVM模型创建/训练% 寻找最佳c参数/g参数[c,g] = meshgrid(-10:0.5:10,-10:0.5:10);[m,n] = size(c);cg = zeros(m,n);eps = 10^(-4);v = 5;bestc = 0;bestg = 0;error = Inf;for i = 1:mfor j = 1:ncmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j) ),' -s 3 -p 0.1'];cg(i,j) = svmtrain(tn_train,pn_train,cmd);if cg(i,j) < errorerror = cg(i,j);bestc = 2^c(i,j);bestg = 2^g(i,j);endif abs(cg(i,j) - error) <= eps && bestc > 2^c(i,j)error = cg(i,j);bestc = 2^c(i,j);bestg = 2^g(i,j);endendend% 创建/训练SVMcmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -p 0.01'];model = svmtrain(tn_train,pn_train,cmd);%% SVM仿真预测[Predict_1,error_1] = svmpredict(tn_train,pn_train,model);[Predict_2,error_2] = svmpredict(tn_test,pn_test,model);% 反归一化predict_1 = mapminmax('reverse',Predict_1,outputps);predict_2 = mapminmax('reverse',Predict_2,outputps);% 结果对比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 onlegend('真实值','预测值')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 onlegend('真实值','预测值')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_train,tn_train,10);% 设置训练参数net.trainParam.epcohs = 1000;net.trainParam.goal = 1e-3;net.trainParam.show = 10;net.trainParam.lr = 0.1;% 训练网络net = train(net,pn_train,tn_train);% 仿真测试tn_sim = sim(net,pn_test);% 均方误差E = mse(tn_sim - tn_test);% 决定系数N = size(t_test,1);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_sim,outputps);% 绘图figure(3)plot(1:length(t_test),t_test,'r-*',1:length(t_test),t_sim,'b:o')grid onlegend('真实值','预测值')xlabel('样本编号')ylabel('耐压强度')string_3 = {'测试集预测结果对比(BP神经网络)';['mse = ' num2str(E) ' R^2 = ' num2str(R2)]};title(string_3)