【机器学习】支持向量机

支持向量机(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');
    
相关推荐
你撅嘴真丑14 小时前
第九章-数字三角形
算法
uesowys14 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
AI_567814 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ValhallaCoder14 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮14 小时前
AI 视觉连载1:像素
算法
智驱力人工智能15 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥15 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风15 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風16 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT0616 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法