【机器学习】支持向量机

支持向量机(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');
    
相关推荐
import_random13 分钟前
[社交网络]布局算法(可视化)
算法
地平线开发者44 分钟前
C++ 部署的性能优化方法
c++·算法·自动驾驶
怀念无所不能的你1 小时前
acwing背包问题求方案数
学习·算法·动态规划·dp
Yingye Zhu(HPXXZYY)1 小时前
洛谷P12238 [蓝桥杯 2023 国 Java A] 单词分类
c++·算法·蓝桥杯
Dovis(誓平步青云)2 小时前
AI遇见端动态神经网络:Cephalon(联邦学习+多模态编码)认知框架构建
图像处理·人工智能·机器学习·微服务·语言模型·数据挖掘·交互
积极向上的向日葵2 小时前
链表的中间节点
数据结构·算法·链表·快慢指针
belldeep2 小时前
python:sklearn 主成分分析(PCA)
python·机器学习·sklearn·pca
曾几何时`2 小时前
C++——哈希表
算法·哈希算法
Y1nhl3 小时前
力扣hot100_普通数组_python版本
开发语言·python·算法·leetcode·职场和发展
m0_504135305 小时前
代码随想录算法训练营第六十一天 | floyd算法
算法