目录
一、介绍
1.1 支持向量机
支持向量机(Support Vector Machine,SVM)是一种用于分类和回归分析的监督学习模型。它的基本原理是找到一个最佳的超平面,将不同类别的数据点分开,并且使得超平面到最近的数据点的距离(即间隔)最大化。在分类问题中,SVM试图找到一个能够将训练数据集中的样本划分成不同类别的超平面;在回归问题中,SVM试图找到一个能够拟合数据并且尽可能地使数据点落在拟合曲线附近的超平面。
SVM的优点之一是它能够在高维空间中有效地进行分类,这意味着即使数据不是线性可分的,也可以通过将输入空间映射到高维空间来进行处理。此外,SVM还具有较强的泛化能力,能够对新样本进行很好的分类。然而,SVM的缺点之一是在处理大规模数据集时可能会变得很慢,因为它需要解决一个凸优化问题来找到最佳的超平面。
为了处理不同类型的数据,SVM可以采用不同的核函数,如线性核、多项式核、径向基核等,以便在不同的问题领域中取得更好的效果。总的来说,支持向量机是一种强大的分类器和回归器,已被广泛应用于许多领域,如生物信息学、图像识别、文本分类等。
1.2线性、硬间隔、软间隔和非线性
1.线性:线性支持向量机是指使用线性超平面(直线或平面)来划分两个不同类别的数据点。这意味着在输入空间中,SVM试图找到一个最佳的超平面,以尽可能地将正例和负例分开。线性SVM在处理线性可分的数据时表现良好,但对于非线性可分的数据则可能无法很好地工作。
2.硬间隔:硬间隔是指当训练数据完全线性可分时,SVM试图找到一个超平面,使得所有的正例样本都在一个侧面,而负例样本都在另一个侧面。硬间隔SVM的目标是最大化超平面到最近的数据点的距离(即间隔),以实现完全分离的分类。
3.软间隔:软间隔是指在训练数据中存在一些噪声或离群点,导致数据不是完全线性可分的情况下,允许一些样本被错误分类的情况。软间隔SVM通过引入松弛变量来允许部分样本位于错误的一侧,同时尽量减小错误分类的数量。这可以通过调整正则化参数来控制。
4.非线性:非线性支持向量机是指在处理非线性可分的数据时,通过将输入空间映射到高维特征空间来实现更好的分类。非线性SVM使用核函数来计算样本在高维空间中的内积,从而避免了显式地进行特征转换。常用的核函数包括多项式核、径向基(RBF)核等,它们可以将低维非线性问题转化为高维线性问题,从而提高了分类的能力。
总的来说,线性SVM在处理线性可分的数据时表现良好,而软间隔SVM则适用于处理具有噪声或离群点的数据。非线性SVM可以通过核函数处理非线性可分的数据,并将其映射到高维特征空间中进行分类。
1.3 最大间隔与分类
划分超平面可以定义为一个线性方程:
其中:是一个法向量,决定了超平面的方向
为训练样本
为位移项,决定了超平面与原点之间的距离
只要确定了法向量 和位移,就可以唯一地确定一个划分超平面。划分超平面和它两侧的边际超平面上任意一点的距离为
则最大间隔为:
既
1.4 对偶问题:等式约束
引入拉格朗日函数:
可将原本约束条件转换为
分别求偏导得
转换为KKT条件
通过SMO优化求得最优解
1.5 核函数
核函数的出现旨在处理那些在原始特征空间中线性不可分的问题,即无法通过一个线性超平面来完美分割的数据。核函数通过将原始特征映射到一个高维空间,使得在新的空间中数据变得线性可分。这种映射使得支持向量机(SVM)在高维空间中能够更灵活地找到一个线性超平面,从而在原始特征空间中解决非线性问题。
核函数的作用在于计算两个样本点在高维空间中的内积,而无需显式计算映射后的数据。这节省了计算成本,使得SVM在高维空间中的计算变得可行。常用的核函数包括线性核、多项式核、径向基函数(RBF)核等,它们分别对应不同的特征映射方式。
二.实验
导入库
from sklearn.svm import SVC
from sklearn import datasets
import numpy as np
import matplotlib.pyplot as plt
import math
数据集
iris = datasets.load_iris()
X = iris['data'][:,(2,3)]
y = iris["target"]
setosa_or_versicolor = (y==0)|(y==1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]
训练模型
svm_clf = SVC(kernel='linear',C=float(1000000000000))
svm_clf.fit(X,y)
决策边界
def plot_svc_decision_boundary(svm_clf, xmin, xmax, sv=True):
w = svm_clf.coef_[0]
b = svm_clf.intercept_[0]
x0 = np.linspace(0,5.5,200)
decision_boundary = -w[0]/w[1]*x0-b/w[1]
margin = 1/w[1]
gutter_up = decision_boundary + margin
gutter_down = decision_boundary - margin
if sv:
svs = svm_clf.support_vectors_
plt.scatter(svs[:,0],svs[:,1],s=180,facecolors = "#FFAAAA")
plt.plot(x0,decision_boundary,"k-",linewidth=2)
plt.plot(x0,gutter_up,"k--",linewidth=2)
plt.plot(x0,gutter_down,"k--",linewidth=2)
对比
x0 = np.linspace(0,5.5,200)
pred_1 = 5*x0 - 20
pred_2 = x0 -1.8
pred_3 = 0.1*x0 + 0.5
画图
plt.figure(figsize=(14,4))
plt.subplot(121)
plt.plot(X[:,0][y==1],X[:,1][y==1],'bs')
plt.plot(X[:,0][y==0],X[:,1][y==0],'ys')
plt.plot(x0,pred_1,"g-",linewidth=2)
plt.plot(x0,pred_2,"m-",linewidth=2)
plt.plot(x0,pred_3,"r-",linewidth=2)
plt.axis([0,5.5,0,2])
plt.subplot(122)
plot_svc_decision_boundary(svm_clf,0,5.5)
plt.plot(X[:,0][y==1],X[:,1][y==1],'bs')
plt.plot(X[:,0][y==0],X[:,1][y==0],'ys')
plt.axis([0,5.5,0,2])
plt.show()
实验结果
三、总结
支持向量机(SVM)是一种强大的监督学习算法,广泛应用于分类和回归任务。以下是SVM的主要优点和缺点:
优点
1.高效处理高维数据:SVM在高维空间中表现良好,尤其是在特征数量多于样本数量的情况下。
2.鲁棒性:通过最大化间隔(Margin),SVM具有较好的泛化能力,能够有效避免过拟合。
3.核函数的灵活性:核函数允许SVM处理非线性分类问题,可以选择或设计不同的核函数以适应各种复杂的数据分布。
4.明确的几何解释:SVM的决策边界和支持向量有明确的几何意义,便于理解和解释模型的工作原理。
5.稀疏解:许多特征对应的权重为零,仅依赖支持向量,有助于减少计算量和存储需求。
6.理论基础扎实:基于统计学习理论,有严格的数学理论作为支持,包括VC维理论和结构风险最小化原则。
缺点
1.计算复杂度高:对于大规模数据集,尤其是样本数量很大时,训练时间和内存需求可能会非常高。
2.参数选择敏感:SVM的性能对核函数和超参数(如正则化参数C和核参数)的选择高度敏感,通常需要交叉验证来优化这些参数。
3.难以处理大规模数据集:尽管SVM在小型和中型数据集上表现良好,但在处理数百万级别的样本时,训练过程可能非常耗时且资源消耗大。
4.结果不易解释:尤其在使用非线性核函数时,结果的解释性较差,不容易理解模型是如何做出决策的。
5.不适用于严重不平衡的数据集:在类别不平衡的情况下,SVM可能会偏向多数类,需要进行特殊处理如调整权重或者采用其他技术来解决这一问题。
6.选择合适的核函数困难:核函数的选择需要根据具体问题和数据分布来定,且某些情况下设计合适的核函数可能并不容易。
SVM是一种强大且灵活的机器学习算法,适用于各种复杂的分类和回归任务。然而,其计算复杂度和对参数选择的敏感性也带来了一定的挑战。在实际应用中,SVM常常与其他算法结合使用,通过合适的预处理和参数优化来发挥其优势。