提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
一、SVM概述
支持向量机(Support Vector Machine,SVM)是一种常见的监督学习算法,用于分类和回归任务。SVM的目标是构建一个能够将不同类别的数据点尽可能正确地分隔开的决策边界。
二、间隔与支持向量
1.间隔
“间隔”就是图中点到“超平面”的距离,公式如下:
2.支持向量
在支持向量机(SVM)算法中,支持向量是训练数据集中距离分类超平面最近的数据点。它们是构建最优决策边界的关键要素。
在二分类问题中,支持向量分为两种类型:正支持向量和负支持向量。正支持向量属于正类别,负支持向量属于负类别。这些支持向量决定了超平面的位置和方向。
SVM通过最大化支持向量与分类超平面之间的间隔来寻找最优决策边界。这个间隔称为“边界距离”或“间隔(margin)”。对于线性可分的情况,SVM选择最大间隔的超平面,使得所有的正支持向量与负支持向量到超平面的距离之和最大化。
3.寻找最大间隔
支持向量机是要找到具有“最大间隔”的划分超平面,即建立如下基本型:
即等价于
三、核函数
1.定义
核函数是支持向量机(SVM)中的一种技术,用于将数据从原始特征空间映射到另一个高维特征空间。通过引入核函数,可以在不显式计算高维特征空间的情况下,通过在原始特征空间中进行计算,将数据映射到高维特征空间中。这样做的好处是可以更有效地处理非线性问题,将非线性问题转化为线性可分或近似线性可分的问题。
2.原理
核函数利用核技巧(Kernel Trick)来处理数据的非线性映射问题。核技巧基于一个重要的数学定理,即Mercer定理,该定理保证了在一定条件下,通过合理选择核函数,可以得到一个有效的映射。核技巧的核心思想是,在原始的输入空间中,通过计算两个样本之间的核函数值,避免直接计算高维特征空间中的内积。
3.类型
线性核函数(Linear Kernel):
线性核函数是最简单的核函数,它实现了将数据从原始特征空间映射到相同维度的特征空间中,即不进行任何显式映射。线性核函数的表达式为 K(x, y) = x^T y,其中x和y是原始特征向量。
多项式核函数(Polynomial Kernel):
多项式核函数将数据从原始特征空间映射到高维的多项式特征空间。它通过引入一个多项式函数来实现映射。多项式核函数的表达式为 K(x, y) = (gamma * x^T y + coef0)^degree,其中gamma、coef0和degree是核函数的参数。
径向基函数(RBF)核函数(Radial Basis Function Kernel):
径向基函数核函数是最常用的核函数之一。它将数据从原始特征空间映射到无限维的特征空间中。径向基函数核函数的表达式为 K(x, y) = exp(-gamma * ||x - y||^2),其中gamma是核函数的参数。
除了上述常用的核函数外,还有其他类型的核函数,如sigmoid核函数和Laplacian核函数等。
四、软间隔
现实任务中往往很难确定合适的核函数使得训练样本在特征空间中线性可分;退一步说,即便恰好找到了某个核函数使训练集在特征空间中线性可分,也很难断定这个貌似线性可分的结果不是由于过拟合所造成的。
缓解该问题的一个方法是允许支持向量机在一些样本上出错。
因此我们引入‘’软间隔‘’的概念,如图
在标准的线性 SVM 中,目标是找到一个最大间隔的决策边界,要求所有训练样本都被正确分类(硬间隔)。然而,当数据不是完全线性可分时,或者存在噪音或离群点时,为了提高模型的鲁棒性和泛化能力,允许一定的错误分类。
软间隔通过引入一个松弛变量(Slack Variable)来实现,这些变量允许一些样本处于决策边界的错误一侧,或者适当违反了间隔要求。松弛变量的引入允许训练样本有一些偏离决策边界,但仍然要尽量使大部分样本正确分类且保持间隔最大化。
软间隔线性 SVM 的目标函数包括两部分:间隔的最大化和正则化项,正则化项用于平衡间隔和错误分类之间的关系。优化目标是通过最小化正则化项和松弛变量的总和来求解模型的参数。其中,松弛变量的值越大,表示对错误分类样本的容忍程度越高。
软间隔线性 SVM 的引入使得算法能够更好地处理复杂的数据集,但也需要在选择合适的正则化参数时进行权衡,以平衡模型的复杂度和训练数据的拟合程度。
五、代码实现
1.数据加载
import numpy as np
def load_data(file_path):
data = np.genfromtxt(file_path, delimiter=',', dtype=np.float64)
X = data[:, :-1]
y = data[:, -1]
return X, y
2.训练函数
# 定义SVM的训练函数,参数分别为数据集X,标签y,学习率learning_rate,lambda参数lambda_param,迭代次数n_iters,惩罚参数C
def fit(X, y, learning_rate=0.0001, C=100, n_iters=1000):
# 获取数据集的样本数和特征数
n_samples, n_features = X.shape
# 将标签y中的负数替换为-1,正数替换为1
y_ = np.where(y <= 0, -1, 1)
# 初始化权重w和偏置b
w = np.zeros(n_features)
b = 0
# 进行n_iters次迭代
for _ in range(n_iters):
# 遍历数据集中的每个样本
for idx, x_i in enumerate(X):
# 如果样本的标签y_i等于1,则更新权重w和偏置b
condition = y_[idx] * (np.dot(x_i, w) - b) >= 1
if condition:
w -= learning_rate * (2 * (1 / C) * w)
else:
# 如果样本的标签y_i等于-1,则更新权重w和偏置b
w -= learning_rate * (2 * w - C * np.dot(x_i, y_[idx]))
b -= learning_rate * y_[idx]*C
# 返回权重w和偏置b
return w, b
3.预测
def predict(X, w, b):
Linear_output = np.dot(X, w) - b
return np.sign(Linear_output)
4.绘图
def plot_draw(X, y, w, b):
# 绘制散点图
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y, s=100, edgecolors='w', cmap='winter')
# 获取坐标轴的范围
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 生成网格数据
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
# 计算等高线
Z = (np.dot(xy, w) - b).reshape(XX.shape)
# 绘制等高线
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
# 显示图形
plt.show()
5.主函数
if __name__ == '__main__':
# 导入数据集
X, y = load_data("SVMdata.txt")
# 训练模型
w, b = fit(X, y)
# 可视化结果
plot_draw(X, y, w, b)
6.运行结果
当可见参数C为默认值时候,模型的容错率较高, 而造成这样的结果是参数lamda_param设置不当,导致模型对噪声和异常值过于敏感,从而将一些本应在间隔之外的数据点错误地分类到间隔之内。
因此我们设置不同的惩罚参数C,进行对比
当C=10 时
当C= 50
当C=100
当C较小时,意味着模型允许一定的误分类。这样的模型相对容错,更关注整体趋势而非单个样本。它会选择更多的支持向量,并且决策边界可能会更加平滑。这种情况下,模型的偏差较高,方差较低。
当C较大时,模型对误分类样本施加较小的惩罚,并更加关注将所有样本正确分类。这可能导致模型的决策边界更严格,容错能力降低,会过度拟合训练数据。这种情况下,模型的偏差较低,但方差较高。
六、总结
1.优点
适用于高维空间:SVM在高维空间中表现较好,适合处理具有大量特征的数据,如文本分类、图像处理等领域。
可以处理非线性问题:通过使用核函数,SVM可以将数据映射到高维空间,从而在原始空间中无法线性分开的问题上建立非线性的决策边界。
少数支持向量:SVM仅依赖于少数支持向量,它们对模型的决策边界起到关键作用。这意味着SVM模型的存储空间较小,预测速度较快。
泛化能力强:SVM基于最大间隔原则,试图找到一个全局最优解,因此具有较好的泛化能力,能够处理噪声数据和小样本数据集。
可以处理异常值:SVM通过支持向量的存在,能够有效地处理异常值,即使少数样本点离决策边界很远,也不会对决策边界产生太大影响。
2.缺点
难以处理大规模数据集:由于需要在整个训练集上进行计算,SVM在处理大规模数据集时会面临较大的计算和内存开销。
参数选择和调节困难:SVM中有多个关键参数,如正则化参数C和核函数参数,选择合适的参数对模型的性能影响很大,需要进行交叉验证等方法进行调参。
对缺失数据敏感:SVM对缺失数据敏感,需要在数据预处理中进行缺失值处理。
不擅长处理多分类问题:原始的SVM模型是二分类模型,对于多分类问题需要进行扩展,如使用一对多或一对一策略。
训练时间较长:SVM的训练时间随着样本数的增加而增加,对于大规模数据集,训练时间较长。
.
综上所述,SVM是一个强大的机器学习算法,具有很好的特性,但在处理大规模数据集和参数调节方面存在一些挑战。在实际应用中,需要根据具体情况选择合适的算法和调参策略。