Matlab中支持向量机学习

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的线性组合 

 

 

教学视频网址:http://www.powercam.cc/slide/6552 

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'); % 加载自带数据。

加载数据失败,此处参考该篇博客https://blog.csdn.net/yyywww666/article/details/49904389

测试数据下载:https://download.csdn.net/download/qq_44004117/12202299 

加载数据结果如下:

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);

计算结果如下:

示例二(分类问题):

UCI数据下载链接:https://archive.ics.uci.edu/ml/index.php

分类问题的解决步骤:
选定训练集和测试机→规范化→特征提取→利用训练集训练分类器得到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

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

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

 

faruto教学视频:https://i.youku.com/u/UNTI3MjQ2MjA=?spm=a2h0k.11417342.soresults.dname

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值