1、什么是支持向量?距离超平面最近的数据点。
2、什么是核函数?从低维映射到高维,实现线性可分。
3、回归型支持向量机:寻找一个最优分类面使得所有训练样本离该最优分类面的误差最小。
4、kernel method
Kernel的基本思想是将低维空间不可分数据映射到高纬度的空间实现区分。
4.1 kernel function
2维空间映射到3维空间后,内积可以用K函数表示。而内积可以用来计算高维度空间的距离和角度,因此不需要映射关系Φ ,仅通过K函数即可计算高维度空间的距离和角度。
4.2 内积矩阵
在高维空间中计算内积,形成内积矩阵,并用核函数表示。
示例:二维空间的分类问题
证明k(x,z)=<x,z>对应的kernel function是正半定矩阵。
如果是预测问题,那么f(x)就是预测值,如果是分类问题,那么f(x)就是对应的类别。
w是trianingsample的线性组合
5、libsvm
5.1、libsvm工具箱的下载及安装
下载地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/
mex -setup→mex -setup C++(按要求选择安装编译器)→make(需在libsvm工具包下)
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'); % 加载自带数据。
加载数据失败,此处参考该篇博客
测试数据下载:
加载数据结果如下:
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);
计算结果如下:
示例二(分类问题):
分类问题的解决步骤:
选定训练集和测试机→规范化→特征提取→利用训练集训练分类器得到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
训练集可视化结果图:
示例三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
对附近的数据点进行预测,结果如下:
注:如果真实值未知,则误差项没有意义,任意给定对应数据即可。