1 简介
支持向量机是利用已知数据类别的样本为训练样本,寻找同类数据的空间聚集特征,从而对测试样本进行分类验证,通过验证可将分类错误的数据进行更正。本文以体检数据为数据背景,首先通过利用因子分析将高维数据进行降维,由此将所有指标整合成几个综合性指标;为降低指标之间的衡量标准所引起的误差,本文利用 MATLAB软件将数据进行归一化处理,结合聚类分析将数据分类;最后本文利用最小二乘支持向量机分类算法进行分类验证,从而计算出数据分类的准确率,并验证了数据分类的准确性和合理性。
2 部分代码
%% 清空环境变量
clc
clear;
close all;
%% 加载能量特征样本
data_123=xlsread('data.xlsx');
%% 构造训练样本和测试样本
sample_1=data_123(1:15,1:5); %
rowrank_1=randperm(size(sample_1,1)); %这里对数据的行进行随机排列;% 随机打乱矩阵的行数
data_1 = sample_1(rowrank_1, :); %data_1表示随机排列后的数据样本
sample_2=data_123(16:25,1:5); %
rowrank_2=randperm(size(sample_2,1)); %这里对数据的行进行随机排列;% 随机打乱矩阵的行数
data_2 = sample_2(rowrank_2, :); %data_2表示随机排列后的数据样本
sample_3=data_123(26:38,1:5); %
rowrank_3=randperm(size(sample_3,1)); %这里对数据的行进行随机排列;% 随机打乱矩阵的行数
data_3 = sample_3(rowrank_3, :); %data_3表示随机排列后的数据样本
sample_4=data_123(39:47,1:5); % 正常
rowrank_4=randperm(size(sample_4,1)); %这里对数据的行进行随机排列;% 随机打乱矩阵的行数
data_4 = sample_4(rowrank_4, :); %data_4表示随机排列后的数据样本
%定义一个变量m,表示选取每种故障训练样本的个数
m=6; %每种类型选取前 m 组作为训练样本。
train_values_1 =data_1(1:m,1:4);
% [train_values_1,settings1] = mapminmax(train_values_1);
train_labels_1=data_1(1:m,5);
train_values_2 =data_2(1:m,1:4);
% [train_values_2,settings2] = mapminmax(train_values_2);
train_labels_2=data_2(1:m,5);
train_values_3 =data_3(1:m,1:4);
% [train_values_3,settings3] = mapminmax(train_values_3);
train_labels_3=data_3(1:m,5);
train_values_4 =data_4(1:m,1:4);
train_labels_4=data_4(1:m,5);
train_values=[train_values_1;train_values_2;train_values_3;train_values_4];
train_labels=[train_labels_1;train_labels_2;train_labels_3;train_labels_4];
%%测试样本
test_values_1 =data_1(m+1:end,1:4);
test_labels_1=data_1(m+1:end,5);
test_values_2 =data_2(m+1:end,1:4);
test_labels_2=data_2(m+1:end,5);
test_values_3 =data_3(m+1:end,1:4);
test_labels_3=data_3(m+1:end,5);
test_values_4 =data_4(m+1:end,1:4);
test_labels_4=data_4(m+1:end,5);
test_values=[test_values_1;test_values_2;test_values_3;test_values_4];
test_labels=[test_labels_1;test_labels_2;test_labels_3;test_labels_4];
tic; %计时开始
%% SVM网络训练
%%参数寻优
[bestacc,bestc,bestg] = SVMcgForClass(train_labels,train_values); %%这里是寻找最优的惩罚系数和核参数
disp(['bestmse=',num2str(bestacc)]);
disp(['bestc=',num2str(bestc)]); %惩罚系数
disp(['bestg=',num2str(bestg)]); %核参数
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
%% 训练并对训练集分类
model = svmtrain(train_labels,train_values,cmd);
%% SVM测试样本分类
[predict_label,accuracy] = svmpredict(test_labels,test_values,model);
% 打印测试集分类准确率
total = length(test_labels); %% the number of label
right = sum(predict_label == test_labels); %% find the accurate number of labels;如果预测的标签和给定的标签是一致的,那么right计数加和;
disp('打印测试集分类准确率');
str = sprintf( 'Accuracy = %g%% (%d/%d)',accuracy(1),right,total);
disp(str);
disp(['bestc=',num2str(bestc)]); %惩罚系数
disp(['bestg=',num2str(bestg)]); %核参数
%% 结果分析
% 测试集的实际分类和预测分类图
figure;
hold on;
plot(test_labels,'o');
plot(predict_label,'r*');
xlabel('测试集样本','FontSize',12);
ylabel('类别标签','FontSize',12);
legend('实际测试集分类','预测测试集分类');
title('基于SVM模型的测试集的实际分类和预测分类图','FontSize',12);
grid on;
toc; %计时结束
3 仿真结果
4 参考文献
[1]王琳, 解婷婷. 基于支持向量机算法的数据分类验证研究[J]. 四川文理学院学报, 2016, 026(005):21-24.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。