【机器学习】支持向量机

支持向量机(Support Vector Machine,SVM )是一种二分类 模型,它的基本模型定义为特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的学习策略就是间隔最大化,可形式化为一个求解凸二次规划问题的过程。

1. 线性可分支持向量机

(1)间隔与支持向量

给定一个特征空间上的训练数据集T,其中++每个样本点都有一个标签++ ,当数据集是线性可分的时候,++SVM的目标是找到一个超平面,能够将不同类别的样本点完全分开++。这个超平面可以用如下方程表示:

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

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

(2)间隔最大化

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

其中,约束条件确保每个样本点都满足间隔要求。

可以看看这个博客,里面有讲解到一些

凸优化理论,凸二次规划问题,对偶问题及KKT条件-CSDN博客

什么是凸二次规划问题-CSDN博客

(3)支持向量

在最优超平面确定之后,位于间隔边界上的样本点被称为支持向量(support vectors)。它们是使得约束条件成为等式的样本点,即:

最优超平面完全由这些支持向量决定。

2. 线性支持向量机与软间隔

在现实问题中,数据往往是线性不可分的,因此引入了软间隔(soft margin)的概念,允许一些样本点不满足间隔要求。软间隔的SVM问题可以表示为:

找超平面可以理解为找共性

3. 非线性支持向量机与核函数

对于非线性问题,SVM通过使用核技巧(kernel trick)将输入空间映射到一个高维特征空间,在这个空间中寻找最优超平面。核函数可以隐式地进行这种映射,而不需要显式地计算映射后的坐标。常用的核函数包括:

  • 多项式核函数(Polynomial kernel)
  • 高斯核函数(RBF, Radial Basis Function)
  • sigmoid核函数

通过核函数,非线性SVM的问题可以转化为与之等价的线性问题求解。

实现过程图

  1. 数据点:图中用橙色和蓝色的点表示两种不同类别的数据。

  2. 决策边界:黑色的实线是SVM找到的最优决策边界,它尽可能大地分隔了两个类别的数据点。

  3. 间隔区域:决策边界两侧的虚线表示SVM的间隔区域。这个区域内的点不会被错误分类。

  4. 支持向量:用黑色边框标记的点是与决策边界最接近的点,也就是支持向量。在SVM中,只有这些点对决策边界的确定起关键作用。

练习-matlab

  1. 生成4类数据mvnrnd([2,2],eye(2),100);

  2. 训练4个支持向量机;

  3. 测试样本3*randn(1,2);

  4. 得到4个预测和最后类别。

  5. 将训练数据和测试数据画图,建议用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');
    
相关推荐
小白的高手之路8 分钟前
Pytorch中torch.nn的学习
人工智能·pytorch·python·深度学习·神经网络·学习·机器学习
梁下轻语的秋缘8 分钟前
每日c/c++题 备战蓝桥杯(全排列问题)
c++·算法·蓝桥杯·深度优先
AredRabbit18 分钟前
vector<int> 的用法
c++·算法·vector
pilgrim5325 分钟前
【二刷代码随想录】双指针-数组相关题型、推荐习题
java·数据结构·算法·leetcode
好好学习^按时吃饭34 分钟前
P4551 最长异或路径
算法·深度优先·图论
爱补鱼的猫猫39 分钟前
模型压缩(量化、剪枝、蒸馏、低秩分解)
算法·机器学习·剪枝
代码骑士1 小时前
聚类(Clustering)基础知识3
算法·支持向量机·聚类
梦姐的编程日志1 小时前
从研究动机视角对无监督图像去雾论文的分类
图像处理·人工智能·深度学习·算法·计算机视觉
Y1nhl1 小时前
搜广推校招面经六十二
人工智能·pytorch·python·算法·机器学习·推荐算法·搜索算法
蓝白咖啡2 小时前
华为OD机试 - 王者荣耀匹配机制 - 回溯(Java 2024 D卷 200分)
java·python·算法·华为od·机试