最小二乘支持向量机
最小二乘支持向量机理论
先埋个坑,先实现再细看理论
最小二乘向量机Matlab实现
工具下载
网上的资源乱七八糟,工欲善其事必先利其器。
我找到的是这个工具箱,有很不错的入门例子
----------------------------------------------------->>>>网址备忘<<<-------------------------------------------------------
LSSVM大体步骤

- 准备好数据 一般是 训练数据X的结构(样本个数X样本属性/特征) 每一行是一个样本,每一列是一个特征。
- 该LSSVM工具箱提供了2种接口 一种就是正常的函数调用 ,一种是面向对象的调用方法(类似python…可以暂时忽略),正常函数调用更简单。
- 对模型参数进行调整 看文档是内置了有 模拟退火算法进行参数寻优(由于自己要用其他优化算法这里对我没啥用) 选取使模型性能最优的参数 一般就是γ \gammaγ 和σ 2 {\sigma}^2σ2这俩参数。
- 用测试集对模型进行分类和测试 ,对结果作图 (plotlssvm好像可以画出2维的分类图)
主要函数
函数 code
作用: 对输入标签进行编码 (独热编码 ?并不是 )
举个例子 如果是个三分类问题 原始label是[1,2,3] 可以被 codebook(依据Minimum Output Coding最小输出编码)编码成
>>codebook
=[-1 1 1;
1 -1 1]
语法:
Yc = code(Y,codefct,codefct_args)
Yc = code(Y,codefct,codefct_args, old_codebook)
[Yc, codebook, oldcodebook] = code(Y,codefct,codefct_args)
函数 trainlssvm
作用:训练LS-SVM的支持值和偏倚项,用于分类或函数逼近
调用范式:
[alpha, b] = trainlssvm({X,Y,type,gam,kernel_par,kernel,preprocess})(函数风格调用)model = trainlssvm(model)(面向对象的调用)这里不深入研究
INPUT:
- X:输入的训练数据矩阵 N*d N:样本输入 d:特征维度
- Y: 对应的训练集标签 N*m N:样本个数 m:m这里我还没弄清标签需不需要one-hot???文档说
X(i,:)对应的标签是Y(i,:)也就是每一行训练样本对应的标签也是一行 - type:如果是回归问题就是
'function estimation'('f')如果是分类就'classifier'('c') - gam: 正则化参数 比如 gama=10
- sig2: 高斯核带宽 如果是线性kernel 要设置为
[] - kernel: 可选 核函数类型默认是
RBF_kernel - preprocess: 预处理,可选
preprocess或者original
OUTPUT:
- alpha:N×m LS-SVM的支持值矩阵
- b:1×m LS-SVM中带有偏置项的向量
函数 tunelssvm
作用: 对LSSVM的 γ \gammaγ和 σ 2 {\sigma}^2σ2 参数进行寻优
基础语法:
- 函数调用
[gam, sig2, cost] = tunelssvm({X,Y,type,[],[]}, optfun, costfun, costargs)
其中调优参数(第四个和第五个参数)的值被设置为空状态。- 使用面向对象的接口就变成了:
model = tunelssvm(model, optfun, costfun, costargs)
如果采用面向对象的接口,要先对model利用initlssvm函数进行创建
model = initlssvm(X,Y,type,[],[]);
具体调用参见说明书,这里由于采用其他优化算法 不多研究。
函数simlssvm
作用:用LSSVM评估给定的数据点
基础语法:
函数接口:
[Yt, Zt] = simlssvm({X,Y,type,gam,sig2}, Xt)
[Yt, Zt] = simlssvm({X,Y,type,gam,sig2,kernel}, Xt)
[Yt, Zt] = simlssvm({X,Y,type,gam,sig2,kernel,preprocess}, Xt)
[Yt, Zt] = simlssvm({X,Y,type,gam,sig2,kernel}, {alpha,b}, Xt)
一般跟在trainlssvm后面,将训练完得到的的{alpha,b},和sig2和gamma传入进去,对测试集进行评估。
INPUT:
参见trainlssvm基本一样
OUTPUT:
Xt: 测试数据的输入 Xt的维度是Nt X d
Yt: 测试得到的 测试集输出 Nt X m
Zt:分类器的潜在变量预测矩阵 Nt X m 这个现在没搞太清是啥
函数prelssvm
预处理
这些函数只能由trainlssvm或simlssvm调用。首先,预处理为每个输入和输出组件分配一个标签(a代表分类变量,b代表二进制变量,c代表连续变量)。根据这个标签,每个尺寸都重新缩放:
- 二分类标签是1和-1
- 连续型是均值和单位方差为0(目测是回归问题标签?)
- 多分类 不进行预处理
函数 plotlassvm
作用:在训练数据的环境中绘制LS-SVM结果
函数接口语法:
plotlssvm({X,Y,type,gam,sig2,kernel,preprocess}, {alpha,b})
plotlssvm({X,Y,type,gam,sig2,kernel,preprocess}, {alpha,b}, grain)
plotlssvm({X,Y,type,gam,sig2,kernel,preprocess}, {alpha,b}, grain, seldims)
plotlssvm({X,Y,type,gam,sig2,kernel,preprocess})
plotlssvm({X,Y,type,gam,sig2,kernel,preprocess}, [], grain)
plotlssvm({X,Y,type,gam,sig2,kernel,preprocess}, [], grain, seldims)
INPUT:
基本参数参照trainlssvm
grain:计算网格的纹理以组成表面(默认值为50),网格数目纹理精度
seldims(*) :要显示的输入数据的维数,默认是2维
函数 crossvalidate
作用: 用l-fold交叉验证来评估模型的性能。不要和tunelssvm一起使用这个函数
函数接口:
[cost, costs] = crossvalidate({X,Y,type,gam,sig2,kernel,preprocess})
[cost, costs] = crossvalidate({X,Y,type,gam,sig2,kernel,preprocess}, L)
[cost, costs] = crossvalidate({X,Y,type,gam,sig2,kernel,preprocess},L, estfct, combinefct)
INPUT:
L:几折交叉验证 交叉验证折数 默认是10折交叉验证
estfct: 基于残差估计代价 还没搞懂 默认值是 mse 感觉是回归用的吧
combinefct: 不同折上的代价值衡量方式?? 默认是 mean
OUTPUT:
cost:L-fold交叉验证的代价值估计
costs:L×1在L不同的折线上估算成本的向量 向量 应该是每一个折上的代价
demo1 helloword
简单介绍了lssvm在分类问题的基本使用方法。
%% HELLO WORD\
clear all; clc;close all;
%% 产生训练数据
X = 2.*rand(100,2)-1;
%% 产生标签
Y = sign(sin(X(:,1))+X(:,2))
%% 建立一个 RBF核的 LS-SVM
% gam 正则化参数用于确定训练误差核最小化和平滑度之间的权衡
% sig2 是高斯核带宽的平方
gam =10;
sig2=0.4
type ='classification';
%% 调用训练函数
% 默认情况下,对原始数据使用prelssvm函数
% 默认自动预处理(归一化?)
[alpha,b]=trainlssvm({X,Y,type,gam,sig2,'RBF_kernel'});
% [alpha,b]=trainlssvm({X,Y,type,gam,sig2,'RBF_kernel','original'});
% 这种是关闭预处理
%%
% 产生测试点------理解为测试集
Xt = 2.*rand(10,2)-1;
% 要进行测试使用simlssvm函数 传入的参数要跟上面一样
Ytest=simlssvm({X,Y,type,gam,sig2,'RBF_kernel'},{alpha,b},Xt);
%% 可视化
% 当输入数据的维数为2时,可以显示LS-SVM结果
plotlssvm({X,Y,type,gam,sig2,'RBF_kernel'},{alpha,b});