SVM是Cortes和 Vapnik在一九九五年的一种基于统计学为基础的机器学习被提出。机器学习的终极目标是寻找最合适的(也即最佳的)分类超平面,再利用该最佳分类超平面,将特征数据很好地区分为两个类别。这种算法在解决小样本、非线性、高维模式识别等问题上具有独一无二的优势,可以扩展到其它的机器学习问题中,如函数拟合等。为了解决线性可分问题,必须使超平面两侧样品与超平面之间的距离之和达到最大,使分类区间最大化,以获得最佳的超平面。在线性不可分的情况下,一般采用非线性的映射方法,将低维空间的线性不可分问题转换成高维的线性可分问题,并将其在高维空间中进行样本的分类。但是,直接将特征从低维映射到高维,需要大量的计算。支持向量机中通常采用核函数,避免了“维度灾难”,核函数在低维空间中进行操作,从而提高了对高维的分类效果,减少了复杂的运算。
SVM是一种有监督的机器学习算法,广泛应用于分类和回归任务中。支持向量机可用于线性和非线性回归问题。支持向量机在不同的维度上表现出不同的形态特征,在二维空间内,支持向量机是一条直线;在三维空间里,它是一个平面;多维空间,即为超平面。
要使分类间隔值最大,设
假定已经发现了最适当的超平面,则该超平面的方程是这样的:
也就是说超平面上的点都符合该方程式。
为了方便运算,在分类超平面两边的数据,分别用1或-1来划分数据,这两种数据一般也称为正样本数据和负样本数据(见下图5-1)
图5-1 分类超平面
支持向量机具有以下的优点:
(1)通用性:函数可以被不同的函数所构建;
(2)鲁棒性:不需要微调;
(3)有效性:永远是解决实际问题的最佳途径之一;
(4)计算简单:方法的实现只需要利用简单的优化技术;
(5)理论上的完善:建立在VC扩展理论基础上的框架。
内核方法是一种被广泛应用于模式分析和辨识的方法,其中最著名的使用就是在SVM。模式分析的总体任务是发现和研究普通类型的数据(如:文字文件、矢量、图片等)中的普通关系(例如簇,排序,主分量,类别等)。内核的方法是把数据映射到更高的维度,这样可以使数据可以变得更易于分开,更好地组织起来。对此映射的格式也不存在任何限制,这一点甚至可以达到一个无限的维度。但由于该映射的运算量很小,因此它可以被看作是一种在较低维度的空间中进行更高的维度中内积的一个计算工具。K是进行内积运算的核函数。支持向量机中核函数确保在低维空间内的计算量,再被输出到更高的维度。K与隐含层当中的神经元对应。将核函数的输出与加权相乘,然后再输入到激活函数中。通常表示为
式中,<,>为内积,Φ(x)为映射函数,利用内核函数的功能,可以在不把输入点明确地映射到这个空间的情况下,将算法传送到更高的维度空间中。这种方法是很好的,因为在某些情况下,我们的高维特性空间可以是无穷维,所以无法进行运算。简单来说,内积可以用来衡量相似度。分类问题就是寻找类似样本的一个过程,一个样本跟另一个样本相似,它们两个就属于同一类,那么在得到的结果函数里,就会有内积。
在支持向量机中,最常见的核函数为:(1)线性核函数;(2)多项式核函数;(3)高斯核函数。
最简单的是线性内核。也就是原始函数,没有映射。它是用一个任选的常量c来表示的,采用线性内核的内核运算则一般与其非内核对应,也就是线性内核的核主成分分析与标准主分量分析技术是一样的。常见核函数公式如表5-1所示。
数据集来源于我自己设计的labview程序输出的电压信息,我通过NI max生成三种不同信号的正弦电压信号,其差异主要集中于极值的差异,见下图。
图 三种信号的可视化
数据集由每种信号200组数据构成,共600组数据。
图 数据集
%%
clear
clc
load ('data.mat')
% 随机打乱数据集
N =randperm(600);
% 训练集——35个样本
train_x = data(N(1:480),:);
train_y = class(N(1:480),:);
% 测试集——4个样本
test_x = data(N(481:end),:);
test_y = class(N(481:end),:);
%%
% 2. 创建/训练SVM模型
t = templateSVM('KernelFunction','linear');%这里采用了线性核函数
model = fitcecoc(train_x,train_y,'Learners',t);
%% V. SVM仿真测试
predict_label = predict(model,train_x);
predict_label1 = predict(model,test_x);
% 训练集精度
acc = 0;
for i = 1:length(train_y)
if predict_label(i,1)==train_y(i,1)
acc = acc+1;
end
end
acc =(acc/length(train_y));
% 测试集精度
acc1 = 0;
for i = 1:length(test_y)
if predict_label1(i,1)==test_y(i,1)
acc1 = acc1+1;
end
end
acc1 =(acc1/length(test_y));
希望这篇文章对你有所帮助。