傻瓜攻略(二十)——MATLAB实现SVM非线性分类

对于大数据的非线性二分类,可以使用 fitckernel 训练二分类高斯核分类模型。

以下内容基于MATLAB官网的介绍文档,进行了一点个人的理解和整理,不算原创,但也不是单纯的翻译,也就恬不知耻的算作原创了。具体内容缺斤少两的,想看具体的英文内容请点击链接 fitckernel

fitckernel使用随机特征展开拟合高斯核分类模型

fitckernel为非线性分类训练或交叉验证二进制高斯核分类模型。 fitckernel对于训练集较大的大数据应用程序更为实用,但也可以应用于内存中较小的数据集。

fitckernel将低维空间中的数据映射到高维空间中,然后通过最小化正则化的目标函数将线性模型拟合到高维空间中。 在高维空间中获得线性模型等效于将高斯核应用于低维空间中的模型。 可用的线性分类模型包括正则化支持向量机(SVM)和逻辑回归模型。

要训练非线性SVM模型以对内存数据进行二进制分类,请参阅fitcsvm。

例子

Train Kernel Classification Model

% 加载电离层数据集,该数据集具有34个样本和351个标签,可表示雷达的返回bad(b)good(g),我一直以为是boy&girl呢
load ionosphere
[n,p] = size(X)
resp = unique(Y)
% 训练一个二进制核分类模型,该模型识别雷达回波是不好的(b)还是好的(g)。提取拟合摘要以确定优化算法将模型拟合到数据的程度。
rng('default') % For reproducibility
[Mdl,FitInfo] = fitckernel(X,Y)
% Mdl是一个分类内核模型。 要检查样本内分类错误,可以将Mdl和训练数据或新数据传递给损失函数。 
% 或者可以将Mdl和新的预测变量数据传递给预测函数,以预测新观测值的类别标签。 还可以将Mdl和训练数据传递到resume恢复功能以继续训练。

Cross-Validate Kernel Classification Model

对SVM模型进行交叉验证,默认采用10折交叉验证。

load ionosphere
rng('default') % For reproducibility
% 对二进制内核分类模型进行交叉验证。 默认情况下,使用10倍交叉验证。
CVMdl = fitckernel(X,Y,'CrossVal','on')
% CVMdl是ClassificationPartitionedKernel模型。由于fitckernel实现了10倍交叉验证,因此CVMdl包含10个分类内核模型,该软件可在训练倍数(折内)观察中训练该模型。
numel(CVMdl.Trained)
% 估计交叉验证的分类误差。
kfoldLoss(CVMdl);

注释掉rng一行,将整个代码放入循环,就可以进行多次验证,得到的结果相互独立

for i=1:10
    load ionosphere
%     rng('default') % For reproducibility
    % 对二进制内核分类模型进行交叉验证。 默认情况下,使用10倍交叉验证。
    CVMdl = fitckernel(X,Y,'CrossVal','on')
    % CVMdl是ClassificationPartitionedKernel模型。 由于fitckernel实现了10倍交叉验证,因此CVMdl包含10个分类内核模型,该软件可在训练倍数(折内)观察中训练该模型。
    numel(CVMdl.Trained)
    % 估计交叉验证的分类误差。
    a(i)=kfoldLoss(CVMdl);
end

Optimize Kernel Classifier

又是喜闻乐见的优化,通过细致的参数优化来得到效果较好的SVM模型。

其他

基础语法Mdl = fitckernel(X,Y)中,

X是预测变量数据,指定为n×p数值矩阵,其中n是样本数,p是每个样本的变量数。

fitckernel仅支持二进制分类。 Y必须完全包含两个不同的类,或者必须使用ClassNames名称/值对参数指定两个要训练的类。

Y的长度必须等于X中的样本数目。

其他的输入相关设置见原网页Name-Value Pair Arguments。

此外,还有输出参数、Limitations、算法和more about等内容,等待着大家探索SVM的热忱之心。

应用

ClassificationKernel介绍了非线性分类的应用,ClassificationKernel分类内核是使用随机特征扩展的二进制高斯内核分类模型的训练模型对象。 对于具有大量训练集的大数据应用程序,ClassificationKernel更实用,但也可以应用于适合内存的较小数据集。

与其他分类模型不同,出于节省内存的目的,ClassificationKernel模型对象不存储训练数据。 但是,它们确实存储信息,例如扩展空间的维数,内核比例参数,先验概率和正则化强度。

可以使用训练有素的分类内核模型来继续使用训练数据进行训练,并预测新数据的标签或分类分数。 有关详细信息,请参阅resumepredict

其中的一个示例如下:

% 导入数据
load ionosphere

% 将数据集划分为训练集和测试集。为测试集指定20%保留样本。
rng('default') % For reproducibility
Partition = cvpartition(Y,'Holdout',0.30);
trainingInds = training(Partition); % 训练集指标
XTrain = X(trainingInds,:);
YTrain = Y(trainingInds);
testInds = test(Partition); % Indices for the test set测试集指标
XTest = X(testInds,:);
YTest = Y(testInds);

% 训练一个二进制核分类模型,该模型识别雷达回波是不好的(b)还是好的(g)。
Mdl = fitckernel(XTrain,YTrain,'IterationLimit',5,'Verbose',1);

% 预测测试集标签,为测试集构建混淆矩阵,并估计测试集的分类误差。混淆矩阵显示Mdl将所有不好的雷达预测为好的。
label = predict(Mdl,XTest);
ConfusionTest = confusionchart(YTest,label);
L = loss(Mdl,XTest,YTest)

% 使用resum继续训练。此功能使用与训练Mdl相同的选项继续训练。
UpdatedMdl = resume(Mdl,XTrain,YTrain);

% Predict the test-set labels, construct a confusion matrix for the test set, and estimate the classification error for the test set.
% 预测测试集标签,为测试集构建混淆矩阵,并估计测试集的分类误差。
% 混淆矩阵显示,在resume通过更多迭代更新分类模型之后,分类错误会减少。
UpdatedLabel = predict(UpdatedMdl,XTest);
UpdatedConfusionTest = confusionchart(YTest,UpdatedLabel);
UpdatedL = loss(UpdatedMdl,XTest,YTest)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值