Hi,我是Johngo~
今儿和大家来了关于支持向量机的一些核心逻辑和精华的理论部分。
首先,支持向量机(Support Vector Machine, SVM)是一种监督学习模型,常用于分类和回归分析。
SVM 的主要思想是通过在特征空间中找到一个最佳的分割超平面,以最大化类间的间隔(即支持向量的间隔),从而实现对数据的分类。
有几个关键的点,大家可以先看看:
- 超平面:
- 在二维空间中,超平面就是一条直线;在三维空间中,超平面是一个平面;在更高维空间中,超平面是一个(n-1)维的子空间。
- 支持向量机通过找到一个超平面将不同类别的数据点分开。
- 支持向量:
- 支持向量是距离决策边界最近的数据点。
- 这些点决定了超平面的最佳位置,因为它们直接影响到边界的构造。
- 最大间隔:
- 支持向量机通过最大化支持向量与超平面之间的间隔来实现最优分类。
- 这个间隔越大,分类器的泛化能力通常越强,即对新数据的预测能力越好。
- 核函数(Kernel Function):
- 核函数允许支持向量机在高维空间中进行分类,即使原始数据在低维空间中是线性不可分的。
- 常见的核函数有线性核、多项式核、高斯核(RBF核)等。
其次, 在工作原理方面:
- 训练阶段:
- 给定一个训练数据集,SVM 找到一个最佳的分割超平面,使得两个类别的数据点之间的间隔最大化。
- 如果数据是线性不可分的,SVM 通过引入核函数将数据映射到高维空间,在高维空间中找到分割超平面。
- 预测阶段:
- 对于新的数据点,SVM 根据其在特征空间中的位置决定它属于哪个类别。
当然,SVM在高维空间中仍然有效,在样本较少的情况下依然能表现良好。而且通过使用不同的核函数,能够处理非线性分类问题。
但是,对于非常大的数据集,计算开销较大,对于噪声较多的数据集(如重叠数据集),效果不佳。而且需要选择合适的核函数和参数,参数调节较为复杂。
上述所有的特点,大家不难看出,支持向量机在许多分类问题中都表现出色,同时也是最常用的算法之一。
核心逻辑
支持向量机 的核心逻辑是寻找一个最佳分割超平面,使得两类数据点之间的间隔最大化。
1. 定义分割超平面
在一个二分类问题中,假设我们有一个训练集 ,其中 是第 个样本的特征向量, 是对应的标签。支持向量机试图找到一个线性分割超平面:
其中, 是权重向量, 是偏置。
2. 间隔和支持向量
定义到超平面的几何间隔为:
我们希望最大化这个间隔。
对于任何一个样本 ,如果它被正确分类,则有:
3. 优化问题
为了找到最大化间隔的超平面,我们需要解决以下优化问题:
同时满足约束条件:
4. 拉格朗日函数
引入拉格朗日乘子 ,构建拉格朗日函数:
对 和 求偏导数并令其等于零:
对 求导:
从而得到:
对 求导:
从而得到:
5. 对偶问题
将这些结果代入拉格朗日函数,得到对偶问题:
同时满足约束条件:
6. 求解对偶问题
通过求解这个对偶问题,可以得到最优的 ,从而得到最优的 和 。
7. 分类决策
对于新的样本 ,分类决策函数为:
核方法的扩展
对于线性不可分的情况,引入核函数 进行高维空间映射:
对偶问题变为:
约束条件不变。
8. 核方法下的分类决策
对于新的样本 ,分类决策函数为:
一个详细推导
- 几何间隔与函数间隔:
- 几何间隔:
- 函数间隔:
- 优化问题:最大化几何间隔等价于最小化 。
- 优化目标与约束:
- 优化目标:最小化
- 约束条件:
- 拉格朗日乘子法:引入 并构建拉格朗日函数。
- 对偶问题的求解:
- 拉格朗日对偶函数:将 和 的表达式代入拉格朗日函数。
- 对偶问题的优化:最大化拉格朗日对偶函数,求得最优 。
- 决策函数与核方法:
- 最优决策函数:利用支持向量和最优 计算新的样本的分类。
- 核方法:处理非线性可分数据,选择合适的核函数。
以上,就是支持向量机实现了最大化间隔的核心逻辑,并通过核方法扩展了其应用范围。
代码实现
接下来,我们用代码实现一个简单的案例,针对上述的核心部分,进行代码的实现~
代码语言:javascript复制import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import svm
from sklearn.datasets import make_circles
from sklearn.preprocessing import StandardScaler
# 生成非线性可分的数据集
X, y = make_circles(n_samples=100, factor=0.5, noise=0.1)
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 使用 RBF 核函数的 SVM 分类器
clf = svm.SVC(kernel='rbf', C=1.0, gamma=0.5)
clf.fit(X, y)
# 创建一个网格来绘制决策边界
xx, yy = np.meshgrid(np.linspace(-2, 2, 100), np.linspace(-2, 2, 100))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制数据点
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
# 绘制数据点
ax.scatter(X[y == 0, 0], X[y == 0, 1], 0, c='b', marker='o', label='Class 0')
ax.scatter(X[y == 1, 0], X[y == 1, 1], 0, c='r', marker='^', label='Class 1')
# 绘制决策边界
ax.plot_surface(xx, yy, Z, cmap='coolwarm', alpha=0.3)
ax.set_xlabel('X1')
ax.set_ylabel('X2')
ax.set_zlabel('Decision Function')
ax.set_title('3D Decision Boundary of SVM with RBF Kernel')
plt.legend()
plt.show()
- 生成数据集:使用
make_circles
函数生成一个非线性可分的数据集,并使用StandardScaler
进行标准化处理。 - 训练SVM分类器:使用径向基核函数(RBF)训练SVM分类器。
- 创建网格:在[-2, 2]范围内创建一个二维网格,用于绘制决策边界。
- 绘制三维图形:使用
matplotlib
中的Axes3D
绘制三维图形,包括数据点和决策边界。
其中:
- 蓝色和红色点分别代表两类数据点。
- 决策边界在三维空间中表示为一个曲面,展示了SVM在高维空间中的分类效果。
代码中,展示了SVM如何使用核函数将非线性问题转换为线性问题,并找到最佳的分类超平面。