1、什么是支持向量?距离超平面最近的数据点。

支持向量机matlab实例 支持向量机 matlab_核函数

2、什么是核函数?从低维映射到高维,实现线性可分。
3、回归型支持向量机:寻找一个最优分类面使得所有训练样本离该最优分类面的误差最小。

4、kernel method

Kernel的基本思想是将低维空间不可分数据映射到高纬度的空间实现区分。

支持向量机matlab实例 支持向量机 matlab_数据_02

4.1 kernel function

2维空间映射到3维空间后,内积可以用K函数表示。而内积可以用来计算高维度空间的距离和角度,因此不需要映射关系Φ ,仅通过K函数即可计算高维度空间的距离和角度。

支持向量机matlab实例 支持向量机 matlab_核函数_03

 

支持向量机matlab实例 支持向量机 matlab_核函数_04

支持向量机matlab实例 支持向量机 matlab_核函数_05

 

4.2 内积矩阵

在高维空间中计算内积,形成内积矩阵,并用核函数表示。 

支持向量机matlab实例 支持向量机 matlab_数据_06

示例:二维空间的分类问题

支持向量机matlab实例 支持向量机 matlab_支持向量机matlab实例_07

支持向量机matlab实例 支持向量机 matlab_核函数_08

 证明k(x,z)=<x,z>对应的kernel function是正半定矩阵。

支持向量机matlab实例 支持向量机 matlab_数据_09

 如果是预测问题,那么f(x)就是预测值,如果是分类问题,那么f(x)就是对应的类别。

支持向量机matlab实例 支持向量机 matlab_加载数据_10

支持向量机matlab实例 支持向量机 matlab_加载数据_11

w是trianingsample的线性组合 

 

支持向量机matlab实例 支持向量机 matlab_支持向量机matlab实例_12

 

支持向量机matlab实例 支持向量机 matlab_核函数_13


5、libsvm

5.1、libsvm工具箱的下载及安装

下载地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

mex -setup→mex -setup C++(按要求选择安装编译器)→make(需在libsvm工具包下)

支持向量机matlab实例 支持向量机 matlab_加载数据_14

model=svmstrain(train_label,train_matrix,['libsvm_options']);

 train_label必须是double型数据(double(y)将参数y转为双精度浮点数类型)。

train_matrix是m*n矩阵,数据类型也为double。

[predicted_label,accuracy,decision_value/prob_estimates]=svmpredict(test_label,test_matrix,model,['libsvm_options']);

自带示例一:

[heart_scale_label,heart_scale_inst] = libsvmread('heart_scale'); % 加载自带数据。

加载数据失败,此处参考该篇博客

测试数据下载: 

加载数据结果如下:

支持向量机matlab实例 支持向量机 matlab_数据_15

SVM求解步骤:对上述特征数据 和标签数据进行训练得到model,再次以上述特征数据为输入,代入model中得出预测值。

clc,clear;
load heart_scale.mat
train = heart_scale_inst;
train_lable = heart_scale_label;
test = train;
test_lable = train_lable;
model = svmtrain(train_lable,train);
[predict_lable,accuracy,decision_values] = svmpredict(test_lable,test,model);
%% 简化写法
clc,clear;
load heart_scale.mat
model=svmtrain(heart_scale_label,heart_scale_inst);
[predicted_label, accuracy, decision_values] = svmpredict(heart_scale_label,heart_scale_inst,model);

计算结果如下:

支持向量机matlab实例 支持向量机 matlab_加载数据_16

示例二(分类问题):

分类问题的解决步骤:
选定训练集和测试机→规范化→特征提取→利用训练集训练分类器得到model→利用model对测试集进行预测→分类器性能评测[分类准确率的高低]

种类标签有1、2和3。将2和3标签变为0标签,三分类问题变为二分类问题。

clear,clc
load wine.data
wine_labels = wine(:,1);
data = wine(:,2:3);
% 将三分类问题变成二分类问题
groups = ismember(wine_labels,1);    % 与1不同的数都等于0
[train,test] = crossvalind('holdOut',groups);% train中90个1,test中88个1。groups可用178代替
% 从data中去90个数作为训练集,取88个数作为测试样本
train_wine = data(train,:);
train_wine_labels = groups(train,:);
train_wine_labels = double(train_wine_labels);

test_wine = data(test,:);
test_wine_labels = groups(test,:);
test_wine_labels = double(test_wine_labels);

% 训练数据规范化
% train_wine = normalization(train_wine',2);
% test_wine = normalization(test_wine',2);
% train_wine = train_wine';
% test_wine = test_wine';
% 
model = svmtrain(train_wine_labels,train_wine);%,'-c 1 -g 0.07');      % 默认设置准确率高
[predict_lable,accuracy,decision_values] = svmpredict(test_wine_labels,test_wine,model);

%% 训练集可视化
[mm,mn] = size(model.SVs);
figure;
hold on;
[m,n] = size(train_wine);
for run = 1:m
	if train_wine_labels(run) ==1
		h1 = plot(train_wine(run,1),train_wine(run,2),'r+');
	else
		h2 = plot(train_wine(run,1),train_wine(run,2),'g*');
	end
	for i = 1:mm
		if model.SVs(i,1)==train_wine(run,1) && model.SVs(i,2)==train_wine(run,2)
			h3 = plot(train_wine(run,1),train_wine(run,2),'o');
		end
	end
end
legend([h1,h2,h3],'1','0','Support Vectors');
hold off
function normal = normalization(x,kind)
%NORMALIZATION 此处显示有关此函数的摘要
%   此处显示详细说明
if nargin < 2
    kind=2; % kind = 1或2 表示第一类或第二类规范化
end
[m,n] = size(x);
normal = zeros(m,n);
%% normalize the data x to [0,1]
if kind == 1
    for i = 1:m
        ma = max (x(i,:));
        mi = min (x(i,:));
        normal(i,:) = (x(i,:)-mi)./(ma-mi);
    end
end
%% normalize the data x to [-1,1]
if kind == 2
    for i = 1:m
        mea = mean(x(i,:));
        va = var(x(i,:));
        normal(i,:) = (x(i,:)-mea)/va;
    end
end

训练集可视化结果图:

支持向量机matlab实例 支持向量机 matlab_加载数据_17

 

示例三libsvm回归分析

利用训练集合已知的x,y来建立回归模型model,然后用这个model去预测。这里面的x就相当于分类中的那个属性矩阵data,y相当于分类中的label。

tic;
close all;clear;clc;
format compact;
% 生成数据
x = (-1:0.1:1)';
y = -x.^2;
% 建模回归模型
model = svmtrain(y,x,'-s 3 -t 2 -c 2.2 -g 2.8 -p 0.01');
% 利用建立的模型看其在训练集合上的回归效果
[py,mse,devalue] = svmpredict(y,x,model);
figure;
plot(x,y,'o');
hold on;
plot(x,py,'r*');
legend('原始数据','回归数据');
grid on;
% 对附近的数据点进行预测
testx = [1.1,1.2,1.3]';
display('真实数据')
testy = -testx.^2
[ptesty,tmse,detesvalue] = svmpredict(testy,testx,model);
display('预测数据');
ptesty
% 保存回归模型
save RegressModel.mat model
% 使用时:load RegressModel
toc

对附近的数据点进行预测,结果如下:

支持向量机matlab实例 支持向量机 matlab_支持向量机matlab实例_18

支持向量机matlab实例 支持向量机 matlab_核函数_19

注:如果真实值未知,则误差项没有意义,任意给定对应数据即可。

支持向量机matlab实例 支持向量机 matlab_数据_20