目录
1.支持向量机概述
1.1基本概念
支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,在分类和回归问题中都有广泛应用。其基本概念如下:
-
支持向量:在SVM中,支持向量是训练数据集中离分割超平面最近的样本点。这些样本点对于确定分割超平面起到关键作用,决定了分类器的性能。
-
分割超平面:SVM的目标是找到一个分割超平面,将数据集划分为不同的类别。在二维空间中,分割超平面是一条直线;在高维空间中,它是一个超平面。分割超平面使得两个不同类别的样本点距离该超平面最大化。
-
核函数:在实际应用中,数据可能不是线性可分的,此时可以使用核函数将数据映射到高维空间,使其在高维空间中线性可分。常用的核函数有线性核、多项式核、高斯核等。
-
间隔和支持向量:SVM通过最大化样本点到分割超平面的间隔来进行分类。间隔是指样本点到分割超平面的距离,而最大化间隔可以提高分类器的泛化能力。支持向量是离分割超平面最近的样本点,其决定了分割超平面的位置和方向。
-
软间隔和惩罚项:在实际应用中,数据可能存在噪声或者重叠,导致无法完全线性分割。这时可以引入软间隔和惩罚项,允许部分样本点落在分割超平面的错误一侧。惩罚项会对错误分类的样本施加惩罚,从而平衡间隔的最大化和错误分类的损失。
-
SVM的优化问题:SVM可以通过求解一个凸优化问题来得到最优的分割超平面。目标是最小化正则化后的损失函数,并使得间隔最大化。常用的求解方法有序列最小优化(SMO)算法和内点法等。
总结起来,支持向量机是一种通过找到最大间隔分割超平面来进行分类的机器学习算法。它的核心思想是将非线性问题转化为线性问题,并通过最大化支持向量与分割超平面之间的间隔来实现分类器的训练和预测。
1.2支持向量
支持向量是指在支持向量机(SVM)算法中对超平面位置具有决定作用的训练样本点。这些支持向量是离分割超平面最近的样本点,它们决定了最终的分割超平面的位置和方向。在SVM的训练过程中,只有支持向量会对最终的决策边界产生影响,而其他的样本点则不会对最终的决策边界产生影响。
支持向量的存在是SVM算法的关键之一,因为它们帮助定义了分割超平面,并且影响着分类器的性能。通过使用支持向量,SVM能够实现对训练数据的高效处理,并且具有很好的泛化能力。因此,支持向量在SVM算法中扮演着非常重要的角色,它们是最终决策边界的关键组成部分,对于SVM的分类性能起着至关重要的作用。
1.3分割超平面
超平面方程为:
其中w为法向量或者叫权重向量,b是偏置,用于控制超平面与原点的距离。
在SVM当中, 定义了超平面本身
对于输入空间中的任意数据点 ,我们可以使用超平面的方程来进行分类:
- 如果 (
),则数据点 (x) 被分为正类别;
- 如果
,则数据点 (x) 被分为负类别。
1.4最大间隔
相比于其他的分类器,SVM需要多考虑一个问题:找到最大间隔
在支持向量机(SVM)中,最大间隔(Maximum Margin)是指在所有可能的超平面中,具有最大间隔的超平面。
样本点到超平面的距离表示为:
则支持向量到超平面的距离为:
所以间隔就表示为:,要找到r为最大的超平面
1.5核函数
核函数是支持向量机(SVM)中的一个重要概念。在SVM中,我们通常使用核函数来将输入空间映射到一个高维特征空间,从而使得在原始输入空间中线性不可分的问题变成了在高维特征空间中线性可分的问题。
具体来说,对于输入空间中的样本点 (x) 和 (x'),它们在特征空间中的内积可以通过核函数来表示:
其中,(K) 是核函数, 表示将样本点映射到特征空间中的映射函数。通过使用核函数,我们可以避免直接计算高维特征空间中的内积,而是直接通过核函数来计算内积,从而节省了计算成本。
常见的核函数包括线性核函数、多项式核函数、高斯径向基函数(RBF)核函数等。这些核函数可以将数据映射到不同的特征空间,从而使得SVM能够处理各种复杂的非线性分类问题。
总的来说,核函数为支持向量机提供了一种灵活的方式来处理非线性问题,它使得SVM在实际应用中能够更加有效地进行分类和回归任务。
1.6软间隔
软间隔(soft margin)是支持向量机(SVM)中的一个概念,与硬间隔(hard margin)相对应。硬间隔要求训练数据在特征空间中能够完全被超平面正确地分割开来,这在某些情况下可能会导致过拟合问题。
软间隔允许在分类超平面上有一些误分类的训练样本存在,以允许更好地处理复杂的数据集和噪声。具体来说,软间隔将约束条件放宽,允许一些训练样本的函数间隔小于1,但仍然要求尽量最大化间隔。
2.代码展示
2,1基本代码
导入必要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
定义一个简单的SVM类
class SimpleSVM:
def __init__(self, learning_rate=0.01, lambda_param=0.01, n_iters=1000):
self.learning_rate = learning_rate
self.lambda_param = lambda_param
self.n_iters = n_iters
self.w = None
self.b = None
SimpleSVM
类包含三个主要参数:learning_rate
:学习率,用于控制模型更新的步长。lambda_param
:正则化参数,用于防止过拟合。n_iters
:迭代次数,即模型训练过程中参数更新的次数。
def fit(self, X, y):
n_samples, n_features = X.shape
self.w = np.zeros(n_features)
self.b = 0
y_ = np.where(y <= 0, -1, 1)
fit
方法用于训练SVM模型。它接受特征矩阵X
和标签向量y
作为输入。- 初始化权重向量
w
为零向量,偏置b
为零。 - 将标签
y
转换为1和-1,以便于后续计算
for _ in range(self.n_iters):
for idx, x_i in enumerate(X):
condition = y_[idx] * (np.dot(x_i, self.w) - self.b) >= 1
if condition:
self.w -= self.learning_rate * (2 * self.lambda_param * self.w)
else:
self.w -= self.learning_rate * (2 * self.lambda_param * self.w - np.dot(x_i, y_[idx]))
self.b -= self.learning_rate * y_[idx]
- 使用双重循环进行梯度下降优化。外层循环控制总体迭代次数,内层循环遍历每个样本。
- 根据条件判断当前样本是否满足约束条件。如果满足,则仅更新正则化项;否则,更新权重和偏置。
def predict(self, X):
linear_output = np.dot(X, self.w) - self.b
return np.sign(linear_output)
predict
方法用于预测新样本。它计算输入样本的线性组合结果并返回符号,即标签。
绘制决策边界函数
def plot_decision_boundary(X, y, model):
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], linestyles=['--', '-', '--'])
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors='k')
plt.xlabel('X1')
plt.ylabel('X2')
plt.title('Support Vector Machine')
加载和处理数据
path = 'D:/作业-机器学习/SVM.txt'
data = pd.read_csv(path, header=None, names=['X1', 'X2', 'Admitted'])
X = data[['X1', 'X2']].values
y = data['Admitted'].values
- 从指定路径加载数据文件
SVM.txt
,并将其存储为pandas
数据框。 - 提取特征
X1
和X2
以及标签Admitted
。
训练模型并绘制决策边界
svm = SimpleSVM()
svm.fit(X, y)
plot_decision_boundary(X, y, svm)
plt.show()
2.2结果展示
3总结
支持向量机(Support Vector Machine,SVM)作为一种经典的机器学习算法,具有以下优点和缺点:
优点:
- 高效性:SVM在高维空间中表现良好,适用于特征维度较高的数据集。
- 泛化能力强:SVM通过最大化间隔来选择最优的超平面,具有较好的泛化能力,可以有效避免过拟合。
- 鲁棒性:SVM对于一些噪声数据和少量异常值具有较好的鲁棒性。
- 非线性映射:通过核函数技巧,SVM可以处理线性不可分的数据,并实现非线性分类。
缺点:
- 参数选择困难:SVM中存在一些关键参数,如正则化参数C和核函数的参数,调参相对复杂,需要谨慎选择以保证模型性能。
- 计算开销大:对于大规模数据集,SVM的计算复杂度较高,训练时间长,不适合处理大规模数据。
- 对缺失数据敏感:SVM对缺失数据比较敏感,在处理缺失数据时需要进行额外的处理。
总的来说,支持向量机是一种强大的机器学习算法,适用于许多领域的分类和回归问题。然而,在应用时需要注意调参和计算效率等方面的问题,以充分发挥其优势并避免其缺点。