SVM是机器学习中的一种方法,在2011年前后深度学习爆发之前曾统治机器学习数十年。它实现简单,在很多情况下表现优秀,需要的数据量小,因此成为机器学习的经典方法之一。
%% 清空环境变量
close all;
clear;
clc;
format compact;
%% 数据提取
%下载四类语音信号
load data1 c1
load data2 c2
load data3 c3
load data4 c4
%四个特征信号矩阵合成一个矩阵
data(1:500,:)=c1(1:500,:);
data(501:1000,:)=c2(1:500,:);
data(1001:1500,:)=c3(1:500,:);
data(1501:2000,:)=c4(1:500,:);
%随机提取1500个样本为训练样本,500个样本为预测样本
%从1到2000间随机排序
k=rand(1,2000);
[m,n]=sort(k);
%输入输出数据
input=data(:,2:25);
output =data(:,1);
train=input(n(1:1500),:);
train_labels=output(n(1:1500),:);
test=input(n(1501:2000),:);
test_labels=output(n(1501:2000),:);
%% 数据预处理
% 数据预处理,将训练集和测试集归一化到[0,1]区间
[mtrain,ntrain] = size(train);
[mtest,ntest] = size(test);
dataset = [train;test];
% mapminmax为MATLAB自带的归一化函数
[dataset_scale,ps] = mapminmax(dataset');
dataset_scale = dataset_scale';
train = dataset_scale(1:mtrain,:);
test = dataset_scale( (mtrain+1):(mtrain+mtest),: );
%% SVM网络训练
model = svmtrain(train_labels, train, '-c 2 -g 1');
%% SVM网络预测
[predict_label, accuracy,predict_values] = svmpredict(test_labels, test, model);
%% 结果分析
% 测试集的实际分类和预测分类图
figure;
hold on;
plot(test_labels,'o');
plot(predict_label,'r*');
xlabel('测试集样本','FontSize',12);
ylabel('类别标签','FontSize',12);
legend('实际测试集分类','预测测试集分类');
title('测试集的实际分类和预测分类图','FontSize',12);
grid on;
%找出判断错误的分类属于哪一类
k=zeros(1,4);
for i=1:500
if test_labels(i,1)~=predict_label(i,1)
c=test_labels(i,1);
switch c
case 1
k(1)=k(1)+1;
case 2
k(2)=k(2)+1;
case 3
k(3)=k(3)+1;
case 4
k(4)=k(4)+1;
end
end
end
%找出每类的个体和
kk=zeros(1,4);
for i=1:500
c=test_labels(i,1);
switch c
case 1
kk(1)=kk(1)+1;
case 2
kk(2)=kk(2)+1;
case 3
kk(3)=kk(3)+1;
case 4
kk(4)=kk(4)+1;
end
end
%正确率
rightridio=(kk-k)./kk;
disp('正确率')
disp(rightridio);