支持向量机(Support Vector Machine,SVM )是一种二分类 模型,它的基本模型定义为特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的学习策略就是间隔最大化,可形式化为一个求解凸二次规划问题的过程。
1. 线性可分支持向量机
(1)间隔与支持向量
给定一个特征空间上的训练数据集T,其中++每个样本点都有一个标签++ ,当数据集是线性可分的时候,++SVM的目标是找到一个超平面,能够将不同类别的样本点完全分开++。这个超平面可以用如下方程表示:

对于任意一个超平面,其两侧的数据点与超平面之间的距离被称为间隔(margin)。具体到每个样本点,我们定义函数间隔(functional margin)为:

所有样本点的函数间隔中的最小值,被称为训练数据集TT的函数间隔。为了使间隔最大化,我们需要将w和b成比例的改变,而不影响超平面本身。因此,定义几何间隔(geometric margin)为:

(2)间隔最大化
SVM的目标是找到最大间隔的超平面,即使得γ最大化。为了求解这个问题,可以将其转化为一个凸二次规划问题:

其中,约束条件确保每个样本点都满足间隔要求。
可以看看这个博客,里面有讲解到一些
凸优化理论,凸二次规划问题,对偶问题及KKT条件-CSDN博客
(3)支持向量
在最优超平面确定之后,位于间隔边界上的样本点被称为支持向量(support vectors)。它们是使得约束条件成为等式的样本点,即:

最优超平面完全由这些支持向量决定。
2. 线性支持向量机与软间隔
在现实问题中,数据往往是线性不可分的,因此引入了软间隔(soft margin)的概念,允许一些样本点不满足间隔要求。软间隔的SVM问题可以表示为:

找超平面可以理解为找共性
3. 非线性支持向量机与核函数
对于非线性问题,SVM通过使用核技巧(kernel trick)将输入空间映射到一个高维特征空间,在这个空间中寻找最优超平面。核函数可以隐式地进行这种映射,而不需要显式地计算映射后的坐标。常用的核函数包括:
- 多项式核函数(Polynomial kernel)
- 高斯核函数(RBF, Radial Basis Function)
- sigmoid核函数
通过核函数,非线性SVM的问题可以转化为与之等价的线性问题求解。
实现过程图

-
数据点:图中用橙色和蓝色的点表示两种不同类别的数据。
-
决策边界:黑色的实线是SVM找到的最优决策边界,它尽可能大地分隔了两个类别的数据点。
-
间隔区域:决策边界两侧的虚线表示SVM的间隔区域。这个区域内的点不会被错误分类。
-
支持向量:用黑色边框标记的点是与决策边界最接近的点,也就是支持向量。在SVM中,只有这些点对决策边界的确定起关键作用。
练习-matlab
生成4类数据mvnrnd([2,2],eye(2),100);
训练4个支持向量机;
测试样本3*randn(1,2);
得到4个预测和最后类别。
将训练数据和测试数据画图,建议用gscatter。
Matlab
% 生成 4 类数据
data1 = mvnrnd([2,2], eye(2), 100);
data2 = mvnrnd([-2,2], eye(2), 100);
data3 = mvnrnd([2,-2], eye(2), 100);
data4 = mvnrnd([-2,-2], eye(2), 100);
% 合并数据
X = [data1; data2; data3; data4];
Y = [ones(100,1); 2*ones(100,1); 3*ones(100,1); 4*ones(100,1)];
% 训练 4 个支持向量机
SVMModels = cell(4,1);
for i = 1:4
Y_temp = (Y == i);
SVMModels{i} = fitcsvm(X, Y_temp);
end
% 生成测试样本
test_sample = 3*randn(1,2);
% 得到 4 个预测
predictions = zeros(4,1);
for i = 1:4
predictions(i) = predict(SVMModels{i}, test_sample);
end
% 得到最后类别
final_class = find(predictions, 1, 'first');
if isempty(final_class)
final_class = 1; % 如果都没有预测为正类,默认归为第一类
end
% 绘制训练数据和测试数据
figure;
gscatter(X(:,1), X(:,2), Y);
hold on;
plot(test_sample(1), test_sample(2), 'ko', 'MarkerFaceColor', 'k', 'MarkerSize', 10);
hold off;
title('Training Data and Test Sample');
xlabel('Feature 1');
ylabel('Feature 2');
legend('Class 1', 'Class 2', 'Class 3', 'Class 4', 'Test Sample');

