【机器学习】支持向量机

支持向量机(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');
    
相关推荐
聚客AI19 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v1 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工1 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农1 天前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了1 天前
AcWing学习——双指针算法
c++·算法
moonlifesudo1 天前
322:零钱兑换(三种方法)
算法
NAGNIP2 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
AI小云2 天前
【机器学习与实战】回归分析与预测:线性回归-03-损失函数与梯度下降
机器学习
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表