MATLAB机器学习系列-7支持向量机原理及其代码实现

支持向量机原理

MATLAB机器学习系列-7支持向量机原理及其代码实现_第1张图片

分类

如图,在分类中,我们需要找到一个超平面(图中包括间隔的平面)把圆圈和方框分开
MATLAB机器学习系列-7支持向量机原理及其代码实现_第2张图片
原问题
间隔最小,同时保证真实输出和模型输出积大于1

MATLAB机器学习系列-7支持向量机原理及其代码实现_第3张图片

对偶问题

原先的最小化问题变成了最大化问题,原先的不等式约束变成了等式约束。

MATLAB机器学习系列-7支持向量机原理及其代码实现_第4张图片 MATLAB机器学习系列-7支持向量机原理及其代码实现_第5张图片

引入间隔c之后
MATLAB机器学习系列-7支持向量机原理及其代码实现_第6张图片

核函数
如果在低维空间找不到超平面,这时需要将数据转换到高维空间。
就需要用到核函数。
MATLAB机器学习系列-7支持向量机原理及其代码实现_第7张图片

回归

MATLAB机器学习系列-7支持向量机原理及其代码实现_第8张图片

原问题与对偶问题
MATLAB机器学习系列-7支持向量机原理及其代码实现_第9张图片

多分类问题

MATLAB机器学习系列-7支持向量机原理及其代码实现_第10张图片

LIBSVM工具箱介绍

libsvm需要C++编译器,输入命令查看
MATLAB机器学习系列-7支持向量机原理及其代码实现_第11张图片
MATLAB机器学习系列-7支持向量机原理及其代码实现_第12张图片
libsvm要求输入和输出行相同
如分类器可以设置为

model=svmtrain(train,label,'- s 0 -t 2 -c 1.2 -g 2.8');

预测

svmpredict(train_label,Train_matrix,model);

我这里未安装,请你们自行安装
LIBSVM分类
I. 清空环境变量
II. 导入数据
III. 数据归一化
IV. SVM创建/训练(RBF核函数)
V. SVM仿真测试
VI. 绘图

I. 清空环境变量

clear all
clc

II. 导入数据

load BreastTissue_data.mat
  1. 随机产生训练集和测试集
n = randperm(size(matrix,1));
  1. 训练集——80个样本
train_matrix = matrix(n(1:80),:);
train_label = label(n(1:80),:);
  1. 测试集——26个样本
test_matrix = matrix(n(81:end),:);
test_label = label(n(81:end),:);

III. 数据归一化

[Train_matrix,PS] = mapminmax(train_matrix');
Train_matrix = Train_matrix';
Test_matrix = mapminmax('apply',test_matrix',PS);
Test_matrix = Test_matrix';

IV. SVM创建/训练(RBF核函数)

  1. 寻找最佳c/g参数——交叉验证方法
[c,g] = meshgrid(-10:0.2:10,-10:0.2:10);
[m,n] = size(c);
cg = zeros(m,n);
eps = 10^(-4);
v = 5;
bestc = 1;
bestg = 0.1;
bestacc = 0;
for i = 1:m
    for j = 1:n
        cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j))];
        cg(i,j) = svmtrain(train_label,Train_matrix,cmd);
        if cg(i,j) > bestacc
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end
        if abs( cg(i,j)-bestacc )<=eps && bestc > 2^c(i,j)
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end
    end
end
cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];
  1. 创建/训练SVM模型
model = svmtrain(train_label,Train_matrix,cmd);

V. SVM仿真测试

[predict_label_1,accuracy_1] = svmpredict(train_label,Train_matrix,model);
[predict_label_2,accuracy_2] = svmpredict(test_label,Test_matrix,model);
result_1 = [train_label predict_label_1];
result_2 = [test_label predict_label_2];

Accuracy = 96.25% (77/80) (classification)
Accuracy = 57.6923% (15/26) (classification)

VI. 绘图

figure
plot(1:length(test_label),test_label,'r-*')
hold on
plot(1:length(test_label),predict_label_2,'b:o')
grid on
legend('真实类别','预测类别')
xlabel('测试集样本编号')
ylabel('测试集样本类别')
string = {'测试集SVM预测结果对比(RBF核函数)';
          ['accuracy = ' num2str(accuracy_2(1)) '%']};
title(string)
MATLAB机器学习系列-7支持向量机原理及其代码实现_第13张图片

LIBSVM回归

%% I. 清空环境变量
clear all
clc

%% II. 导入数据
load concrete_data.mat

%%
% 1. 随机产生训练集和测试集
n = randperm(size(attributes,2));

%%
% 2. 训练集——80个样本
p_train = attributes(:,n(1:80))';
t_train = strength(:,n(1:80))';

%%
% 3. 测试集——23个样本
p_test = attributes(:,n(81:end))';
t_test = strength(:,n(81:end))';

%% III. 数据归一化
%%
% 1. 训练集
[pn_train,inputps] = mapminmax(p_train');
pn_train = pn_train';
pn_test = mapminmax('apply',p_test',inputps);
pn_test = pn_test';

%%
% 2. 测试集
[tn_train,outputps] = mapminmax(t_train');
tn_train = tn_train';
tn_test = mapminmax('apply',t_test',outputps);
tn_test = tn_test';

%% IV. SVM模型创建/训练
%%
% 1. 寻找最佳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:m
    for j = 1:n
        cmd = ['-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) < error
            error = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end
        if 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);
        end
    end
end

%%
% 2. 创建/训练SVM  
cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -p 0.01'];
model = svmtrain(tn_train,pn_train,cmd);

%% V. SVM仿真预测
[Predict_1,error_1] = svmpredict(tn_train,pn_train,model);
[Predict_2,error_2] = svmpredict(tn_test,pn_test,model);

%%
% 1. 反归一化
predict_1 = mapminmax('reverse',Predict_1,outputps);
predict_2 = mapminmax('reverse',Predict_2,outputps);

%%
% 2. 结果对比
result_1 = [t_train predict_1];
result_2 = [t_test predict_2];

%% VI. 绘图
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)

MATLAB机器学习系列-7支持向量机原理及其代码实现_第14张图片 MATLAB机器学习系列-7支持向量机原理及其代码实现_第15张图片

代码可以不用网格搜索寻找最优参数,直接指定参数‘

代码和数据百度云

链接:https://pan.baidu.com/s/1w50keCHeEfx5djVaOZlsUg 
提取码:1l82 
复制这段内容后打开百度网盘手机App,操作更方便哦

在这里插入图片描述

作者:电气工程的计算机萌新-余登武
在这里插入图片描述

你可能感兴趣的:(C++和MATLAB系列,matlab,机器学习)