目前基于紫外-可见光光谱法的建筑物废弃材料判别模型大多使用主成分分析(PCA)进行特征提取,然而,对于光谱相似度较高的有建筑物废弃材料,仅从数据驱动的角度提取其方差最大的方向作为特征进行识别效果往往不佳。针对有机污染物光谱数据多重共线性以及谱峰重叠干扰的问题,开展了基于连续投影算法(SPA)和支持向量机(SVM)的紫外-可见光光谱建筑物废弃材料判别方法研究。实验结果表明, SPA作为一种提取光谱数据原始特征波段的方法,可以有效的对建筑物废弃材料的紫外-可见光光谱进行特征提取,提升不同物质之间的差异,在一定程度上消除多重共线性和谱峰重叠干扰,从而提高分类模型的准确率。该方法对于解决建筑物废弃材料类型判别问题具有参考价值。
2 部分代码
function [Accuracy,predict_label1,predict_label]=SVMMain(train_x,train_y,test_x,test_y)
% %% PCA主成分分析
% [coeff,~,latent]=pca(data);
% %% 计算累计贡献率
% threshold=0.98;
% sum_latent=cumsum(latent/sum(latent));
% dimension=find(sum_latent>threshold);
% Dim=dimension(1);
% %% 降维之后的新数据
% Newdata=data*coeff(:,1:Dim);
% %% 划分训练集和测试集
% nn=randperm(length(Newdata));
%ratio=0.7;
%% 读取SPA筛选出的变量
% load Vum
%% 划分训练集和测试集
% nn=randperm(size(data,1));
% ratio=0.7;
% tr=floor(ratio*size(data,1));
% % %% 训练集
% train_x=data(nn(1:tr),:)';
% train_y=Label(nn(1:tr));
% % %% 测试集
% test_x=data(nn(tr+1:end),:)';
% test_y=Label(nn(tr+1:end));
train_y=train_y';
test_y=test_y';
%% 数据预处理归一化
% 训练集归一化
[inputn,inputps] = mapminmax(train_x,0,1);
% [outputn,outputps] = mapminmax(train_y,0,1);
% 测试集归一化
input1 = mapminmax('apply',test_x,inputps);
% output1 = mapminmax('apply',test_y,outputps);
%% 支持向量机(SVM)
%% 参数
%网格搜索法
% [bestacc,bestc,bestg]=SVMcgForClass(train_y,inputn',-10,10,-10,10,5,0.5,0.5,4.5);%v=5 表示5重交叉验证
% %c和g搜索步长均为0.5 网格搜索结果上准确率显示间隔为0.9
% %c和g的搜索范围均为[2^(-10) 2^10]
bestc=512;
bestg=0.0078;
% disp('打印参数选择结果');
str=sprintf('Best c = %g,Best g = %g',bestc,bestg);
disp(str)
%% 利用最佳的参数进行SVM网络训练
cmd_svm = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
model_svm = svmtrain(train_y,inputn',cmd_svm);
%% SVM训练集
[predict_label1,accuracy1] = svmpredict(train_y,inputn',model_svm);
% 打印训练集分类准确率
total1 = length(train_y);
right1 = sum(predict_label1 == train_y);
disp('打印训练集分类准确率');
str = sprintf( 'Accuracy = %g%% (%d/%d)',accuracy1(1),right1,total1);
disp(str);
%% 绘制训练集结果图
figure
plot(predict_label1 ,'b*','linewidth',1)
hold on
plot(train_y,'ro','linewidth',1)
xlabel('训练集')
ylabel('标签(Label)')
legend('预测标签','实际标签')
methods = {'红砖','渣土','混凝土'};
set(gca,'YGrid', 'on','YTickLabel',methods);
set(gca,'ytick',[1,2,3])
title(['SPA+SVM识别准确率:' num2str(accuracy1(1)) '%'],'fontsize',13)%title(图形名称)
axis tight
%% SVM测试集
[predict_label,accuracy] = svmpredict(test_y,input1',model_svm);
%% 打印测试集分类准确率
total = length(test_y);
right = sum(predict_label == test_y);
disp('打印测试集分类准确率');
str = sprintf( 'Accuracy = %g%% (%d/%d)',accuracy(1),right,total);
disp(str);
figure
plot(predict_label,'b*','linewidth',1)
hold on
plot(test_y,'ro','linewidth',1)
xlabel('测试集')
ylabel('标签(Label)')
legend('预测标签','实际标签')
methods = {'红砖','渣土','混凝土'};
set(gca,'YGrid', 'on','YTickLabel',methods);
set(gca,'ytick',[1,2,3])
title(['SPA+SVM识别准确率:' num2str(accuracy(1)) '%'],'fontsize',13)%title(图形名称)
axis tight
%% 评价指标
[Accuracy,Precision,Recall,F_score]=Metrix(test_y,predict_label);
%% 显示
disp(['准确率Accuracy:',num2str(Accuracy) '%'])
% disp(['精准率Precision:',num2str(Precision) '%'])
% disp(['召回率Recall:',num2str(Recall) '%'])
% disp(['F_score:',num2str(F_score) '%'])
[1]黄平捷, 李宇涵, 俞巧君,等. 基于SPA和多分类SVM的紫外-可见光光谱饮用水有机污染物判别方法研究[J]. 光谱学与光谱分析, 2020, 40(7):6.
部分理论引用网络文献,若有侵权联系博主删除。