机器学习:支持向量机(SVM):SVM的数学基础_第1页
机器学习:支持向量机(SVM):SVM的数学基础_第2页
机器学习:支持向量机(SVM):SVM的数学基础_第3页
机器学习:支持向量机(SVM):SVM的数学基础_第4页
机器学习:支持向量机(SVM):SVM的数学基础_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

机器学习:支持向量机(SVM):SVM的数学基础1SVM简介1.11什么是SVM支持向量机(SupportVectorMachine,SVM)是一种监督学习模型,主要用于分类和回归分析。SVM的基本思想是找到一个超平面,使得两类样本在该超平面两侧的间隔最大化。这个超平面被称为最大间隔超平面,而位于间隔边界上的样本点被称为支持向量。1.1.1数学定义假设我们有一组数据点xi∈Rn,其中i=1,...,如果yi=如果yi=换句话说,SVM试图找到一个决策边界,使得所有正类样本点位于w⋅x+1.1.2最大间隔超平面SVM通过最大化间隔来提高模型的泛化能力。间隔是指从超平面到最近的样本点的距离。最大间隔超平面不仅能够正确分类训练数据,还能够更好地处理未见过的数据,因为它避免了过拟合。1.1.3支持向量支持向量是那些距离超平面最近的样本点。它们决定了超平面的位置和方向。在SVM中,只有支持向量对模型的决策有影响,其他样本点则不影响模型的构建。1.22SVM在机器学习中的地位SVM在机器学习领域中占有重要地位,尤其是在处理高维数据和小样本数据时表现出色。它能够处理线性可分和非线性可分的数据集,通过引入核函数(KernelFunction)来解决非线性分类问题。SVM的理论基础坚实,具有良好的数学解释性,这使得它在学术和工业界都得到了广泛的应用。1.33SVM的应用场景SVM广泛应用于各种领域,包括但不限于:文本分类:在自然语言处理中,SVM用于分类文档或文本,如情感分析、主题分类等。图像识别:SVM可以用于识别图像中的对象,如手写数字识别、人脸识别等。生物信息学:在基因表达数据的分析中,SVM用于预测基因的功能或疾病相关性。手写数字识别:SVM在识别手写数字方面表现优异,是MNIST数据集上常用的分类器之一。1.3.1示例:使用Python的Scikit-Learn库进行SVM分类#导入必要的库

fromsklearnimportdatasets

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.preprocessingimportStandardScaler

fromsklearn.svmimportSVC

fromsklearn.metricsimportaccuracy_score

#加载数据集

iris=datasets.load_iris()

X=iris.data[:,[2,3]]#只使用花瓣长度和宽度作为特征

y=iris.target

#划分训练集和测试集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)

#数据预处理

sc=StandardScaler()

sc.fit(X_train)

X_train_std=sc.transform(X_train)

X_test_std=sc.transform(X_test)

#创建SVM分类器

svm=SVC(kernel='linear',C=1.0,random_state=0)

svm.fit(X_train_std,y_train)

#预测

y_pred=svm.predict(X_test_std)

#计算准确率

print('Accuracy:%.2f'%accuracy_score(y_test,y_pred))在这个例子中,我们使用了Scikit-Learn库中的SVM分类器(SVC)对Iris数据集进行分类。我们首先加载数据集,然后划分训练集和测试集。由于SVM对特征的尺度敏感,我们使用StandardScaler对数据进行预处理,确保特征在同一尺度上。接着,我们创建一个线性核的SVM分类器,并使用训练数据对其进行训练。最后,我们使用测试数据进行预测,并计算预测的准确率。1.4结论SVM是一种强大的机器学习模型,它通过最大化间隔来提高分类的准确性。无论是线性可分还是非线性可分的数据,SVM都能够通过适当的核函数找到最佳的分类边界。在实际应用中,SVM因其高精度和鲁棒性而受到青睐,尤其是在处理高维数据和小样本数据时。通过上述示例,我们可以看到SVM在Python的Scikit-Learn库中的实现和应用,这为机器学习的实践者提供了一个强大的工具。2线性可分SVM的数学原理2.11最大间隔分类器的概念最大间隔分类器是支持向量机(SVM)的核心思想。在二分类问题中,假设我们有一组线性可分的数据点,这些数据点可以被一条超平面正确分类。SVM的目标是找到这样一条超平面,它不仅能够正确分类所有数据点,而且还能最大化该超平面与两类数据点之间的间隔。2.1.1定义超平面:在n维空间中,一个n-1维的平面,可以表示为wTx+b=0,其中间隔:对于分类问题,间隔是指超平面到最近的数据点的距离。最大间隔分类器试图最大化这个距离,以提高分类的鲁棒性。2.1.2目标函数SVM的目标函数是:min约束条件为:y其中,yi是第i个数据点的类别标签(+1或−1),x2.22支持向量的定义支持向量是那些最接近超平面的数据点,它们决定了超平面的位置和方向。在最大间隔分类器中,只有支持向量对超平面的确定有贡献,其他数据点对超平面的位置没有影响。2.2.1作用确定超平面:超平面的位置和方向完全由支持向量决定。鲁棒性:支持向量机对非支持向量的移动不敏感,这使得模型具有较好的鲁棒性。2.2.2示例假设我们有以下数据点,其中红色点表示类别+1,蓝色点表示类别−x1x2y12123134100-101-110-1我们可以使用Python的scikit-learn库来训练一个SVM模型,并找出支持向量:importnumpyasnp

fromsklearnimportsvm

#数据点

X=np.array([[1,2],[2,3],[3,4],[0,0],[0,1],[1,0]])

y=np.array([1,1,1,-1,-1,-1])

#创建SVM分类器

clf=svm.SVC(kernel='linear')

#训练模型

clf.fit(X,y)

#找出支持向量

support_vectors=clf.support_vectors_2.33拉格朗日乘子法与对偶问题拉格朗日乘子法是一种解决带有约束条件的优化问题的方法。在SVM中,我们使用拉格朗日乘子法将原始的优化问题转换为对偶问题,这样可以简化计算,并且在处理非线性问题时,可以引入核函数。2.3.1原始问题原始的SVM优化问题可以表示为:mins2.3.2对偶问题使用拉格朗日乘子法,我们可以将原始问题转换为对偶问题:maxs 其中,αi2.3.3示例在Python中,我们可以使用scikit-learn库的SVC类来训练一个SVM模型,并通过dual_coef_属性来获取拉格朗日乘子:importnumpyasnp

fromsklearnimportsvm

#数据点

X=np.array([[1,2],[2,3],[3,4],[0,0],[0,1],[1,0]])

y=np.array([1,1,1,-1,-1,-1])

#创建SVM分类器

clf=svm.SVC(kernel='linear')

#训练模型

clf.fit(X,y)

#获取拉格朗日乘子

lagrange_multipliers=clf.dual_coef_通过以上步骤,我们详细介绍了线性可分SVM的数学原理,包括最大间隔分类器的概念、支持向量的定义以及拉格朗日乘子法与对偶问题的转换。这些原理是理解和支持向量机算法的关键。3非线性SVM的数学基础3.11核函数的引入在处理线性不可分的数据集时,支持向量机(SVM)通过引入核函数(kernelfunction)来实现非线性分类。核函数允许SVM在高维空间中寻找一个超平面,即使在原始特征空间中数据是不可分的,通过映射到高维空间,数据可能变得线性可分。3.1.1核函数的定义核函数定义为:K其中,Kx,y是核函数,ϕ3.1.2核函数的种类常见的核函数包括:-线性核函数:Kx,y=x⋅y-多项式核函数:Kx3.1.3示例:使用Scikit-Learn的RBF核函数fromsklearnimportsvm

fromsklearn.datasetsimportmake_circles

importnumpyasnp

#生成非线性可分数据

X,y=make_circles(n_samples=400,factor=0.3,noise=0.1)

#创建SVM分类器,使用RBF核函数

clf=svm.SVC(kernel='rbf',gamma='scale')

#训练模型

clf.fit(X,y)

#预测新数据点

new_data=np.array([[0,0],[1,1]])

predictions=clf.predict(new_data)

print(predictions)3.22高斯核函数详解高斯核函数,也称为径向基函数(RBF),是SVM中用于非线性分类的最常用核函数之一。它基于两个数据点之间的欧几里得距离,通过一个高斯函数来计算它们在高维空间中的相似度。3.2.1高斯核函数的数学表达高斯核函数定义为:K其中,γ是高斯核函数的参数,控制着数据点在高维空间中的分布密度。当γ较大时,数据点在高维空间中的分布更加密集,SVM模型将更加复杂,可能过拟合;当γ较小时,数据点在高维空间中的分布更加稀疏,SVM模型将更加简单,可能欠拟合。3.2.2高斯核函数的性质局部性:高斯核函数对距离敏感,当两个数据点距离较远时,它们在高维空间中的相似度将迅速下降。非线性映射:高斯核函数能够将数据点映射到无限维的特征空间,使得原本线性不可分的数据变得线性可分。3.2.3示例:调整高斯核函数的参数fromsklearnimportsvm

fromsklearn.datasetsimportmake_moons

importnumpyasnp

importmatplotlib.pyplotasplt

#生成非线性可分数据

X,y=make_moons(n_samples=100,noise=0.1)

#创建SVM分类器,使用不同$\gamma$值的RBF核函数

gammas=[0.01,0.1,1,10]

fig,axs=plt.subplots(2,2)

forax,gammainzip(axs.flatten(),gammas):

clf=svm.SVC(kernel='rbf',gamma=gamma)

clf.fit(X,y)

ax.scatter(X[:,0],X[:,1],c=y,s=30,cmap=plt.cm.Paired)

ax.set_title(f"$\gamma={gamma}$")

plt.show()3.33SVM与核函数的结合SVM与核函数的结合使得SVM能够处理非线性分类问题。通过选择合适的核函数,SVM能够在高维空间中找到一个最优的超平面,即使在原始特征空间中数据是不可分的。3.3.1SVM的优化问题在非线性SVM中,优化问题变为:minsubjectto其中,ϕxi是将数据点xi映射到高维空间的函数,ξ3.3.2示例:使用SVM与高斯核函数进行分类fromsklearnimportsvm

fromsklearn.datasetsimportmake_blobs

importnumpyasnp

importmatplotlib.pyplotasplt

#生成非线性可分数据

X,y=make_blobs(n_samples=100,centers=2,random_state=6,cluster_std=1.5)

#创建SVM分类器,使用高斯核函数

clf=svm.SVC(kernel='rbf',gamma=0.1)

#训练模型

clf.fit(X,y)

#绘制决策边界

defplot_decision_boundary(clf,X,y):

h=.02#meshgrid步长

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,h),

np.arange(y_min,y_max,h))

Z=clf.predict(np.c_[xx.ravel(),yy.ravel()])

Z=Z.reshape(xx.shape)

plt.contourf(xx,yy,Z,cmap=plt.cm.coolwarm,alpha=0.8)

plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.coolwarm)

plt.title("SVMwithRBFKernel")

plt.show()

plot_decision_boundary(clf,X,y)通过上述示例,我们可以看到SVM与高斯核函数结合后,能够有效地处理非线性分类问题,找到一个复杂的决策边界来分类数据。4SVM的优化与求解4.11凸优化问题在支持向量机(SVM)中,我们寻求最大化分类间隔,这可以转化为一个优化问题。SVM的优化目标是找到能够正确分类所有训练样本的超平面,并且这个超平面的间隔最大。这个优化问题通常是一个凸优化问题,因为SVM的目标函数是凸的,约束条件也是凸的。凸优化问题的好处在于,它们具有全局最优解,且许多高效的算法可以用来求解。4.1.1目标函数SVM的目标函数是关于权重向量w和偏置项b的,形式如下:min4.1.2约束条件对于每个训练样本xi,yi,其中xiy这个优化问题是一个二次规划问题,属于凸优化的范畴。4.22SMO算法详解SMO(SequentialMinimalOptimization)算法是一种用于求解SVM优化问题的高效算法。它通过将原始的二次规划问题分解成一系列最小优化问题来解决,这些最小优化问题可以解析求解,从而避免了使用复杂的二次规划求解器。4.2.1基本思想SMO算法的基本思想是每次选择两个变量进行优化,其中一个变量是违反KKT条件最严重的,另一个变量是与第一个变量相关性最大的。通过迭代这个过程,最终可以找到全局最优解。4.2.2算法步骤初始化:选择一个变量作为第一个优化变量,通常选择违反KKT条件最严重的变量。选择第二个变量:选择与第一个变量相关性最大的变量,这通常通过计算拉格朗日乘子的改变量来实现。优化两个变量:解析求解这两个变量的优化问题,更新它们的值。更新其他变量:根据两个优化变量的更新,更新其他变量的拉格朗日乘子。重复:重复步骤2到4,直到所有变量都满足KKT条件。4.2.3代码示例下面是一个使用Python和cvxopt库实现SMO算法的简化示例:importnumpyasnp

fromcvxoptimportmatrix,solvers

#示例数据

X=np.array([[3,3],[1,1],[2,0],[0,2]])

y=np.array([1,-1,-1,1])

#计算核函数

defkernel(x1,x2):

returnnp.dot(x1,x2)

#计算拉格朗日乘子

defsmo(X,y,C,kernel,tol=1e-3,max_passes=5):

m,n=X.shape

alphas=np.zeros(m)

b=0

passes=0

while(passes<max_passes):

num_changed_alphas=0

foriinrange(m):

Ei=np.sum([alphas[k]*y[k]*kernel(X[k],X[i])forkinrange(m)])+b-y[i]

if((y[i]*Ei<-tolandalphas[i]<C)or(y[i]*Ei>tolandalphas[i]>0)):

#选择第二个变量

j=np.random.choice([kforkinrange(m)ifk!=i])

Ej=np.sum([alphas[k]*y[k]*kernel(X[k],X[j])forkinrange(m)])+b-y[j]

#保存旧的拉格朗日乘子

alpha_i_old=alphas[i].copy()

alpha_j_old=alphas[j].copy()

#计算边界

if(y[i]!=y[j]):

L=max(0,alphas[j]-alphas[i])

H=min(C,C+alphas[j]-alphas[i])

else:

L=max(0,alphas[i]+alphas[j]-C)

H=min(C,alphas[i]+alphas[j])

#如果L==H,不进行优化

ifL==H:

continue

#计算eta

eta=kernel(X[i],X[i])+kernel(X[j],X[j])-2*kernel(X[i],X[j])

ifeta<=0:

continue

#更新alpha_j

alphas[j]-=y[j]*(Ei-Ej)/eta

alphas[j]=min(H,max(L,alphas[j]))

#更新alpha_i

alphas[i]+=y[i]*y[j]*(alpha_j_old-alphas[j])

#更新b

b1=b-Ei-y[i]*(alphas[i]-alpha_i_old)*kernel(X[i],X[i])-y[j]*(alphas[j]-alpha_j_old)*kernel(X[i],X[j])

b2=b-Ej-y[i]*(alphas[i]-alpha_i_old)*kernel(X[i],X[j])-y[j]*(alphas[j]-alpha_j_old)*kernel(X[j],X[j])

if0<alphas[i]<C:

b=b1

elif0<alphas[j]<C:

b=b2

else:

b=(b1+b2)/2

num_changed_alphas+=1

ifnum_changed_alphas==0:

passes+=1

else:

passes=0

returnalphas,b

#设置参数

C=1.0

#运行SMO算法

alphas,b=smo(X,y,C,kernel)

#输出结果

print("拉格朗日乘子:",alphas)

print("偏置项:",b)4.2.4代码解释这段代码首先定义了数据集X和标签y,然后定义了一个简单的线性核函数kernel。smo函数实现了SMO算法的核心逻辑,包括选择变量、计算边界、更新拉格朗日乘子和偏置项。最后,我们设置了参数C,并运行了SMO算法,输出了拉格朗日乘子和偏置项。4.33SVM的求解过程SVM的求解过程通常包括以下步骤:构建优化问题:根据训练数据和SVM的数学模型,构建一个二次规划问题。选择优化算法:选择一个优化算法来求解这个二次规划问题,如SMO算法。求解优化问题:使用所选的优化算法求解二次规划问题,得到拉格朗日乘子α和偏置项b。构建决策函数:根据求解得到的α和b,构建决策函数fx=i预测新样本:使用决策函数对新样本进行分类预测。在实际应用中,SVM的求解过程可能还会包括选择合适的核函数、调整参数C和γ(对于非线性核函数),以及使用交叉验证等技术来避免过拟合。5SVM的软间隔与C参数5.11软间隔的概念在支持向量机(SVM)中,软间隔的概念是为了解决线性不可分问题而引入的。在现实世界的数据集中,数据点往往不会完美地被一个超平面分开,即存在一些点会误分类。硬间隔SVM要求所有数据点都严格满足分类条件,这在处理噪声数据或复杂数据集时可能无法实现。因此,软间隔SVM允许一定程度的误分类,通过引入松弛变量(slackvariables)来调整分类边界,使得模型能够容忍一些错误,从而获得更好的泛化能力。5.1.1松弛变量松弛变量ξi(读作“xi”)被添加到每个数据点的分类条件中,允许数据点在一定程度上违反分类边界。对于一个数据点xi,如果它位于分类边界错误的一侧,5.1.2目标函数软间隔SVM的目标函数变为:min其中,w是权重向量,b是偏置项,ξ是所有数据点的松弛变量向量,C是惩罚参数,n是数据点的数量。这个目标函数试图在最大化间隔和最小化误分类之间找到一个平衡。5.22C参数的作用与选择5.2.1C参数的作用在软间隔SVM中,C参数控制了模型对误分类的容忍度。C的值越大,模型对误分类的惩罚越重,这意味着模型将更加努力地尝试正确分类所有训练数据点,即使这样做可能会导致过拟合。相反,C的值越小,模型对误分类的容忍度越高,这有助于模型避免过拟合,但可能会导致训练数据的分类错误增加。5.2.2C参数的选择选择合适的C值是一个重要的步骤,因为它直接影响模型的性能。通常,C值的选择是通过交叉验证(Cross-Validation)来确定的。在交叉验证中,数据集被分为几个子集,模型在不同的C值下进行训练和测试,以找到使模型在测试集上表现最佳的C值。这有助于确保模型不仅在训练数据上表现良好,而且在未见过的数据上也具有良好的泛化能力。5.33软间隔SVM的数学推导软间隔SVM的数学推导基于拉格朗日乘子法(LagrangeMultipliers)和对偶问题(DualProblem)。原始的软间隔SVM问题可以表示为:min5.3.1拉格朗日函数引入拉格朗日乘子αi和βL5.3.2对偶问题通过求解拉格朗日函数关于w、b和ξ的偏导数并令其等于0,可以得到对偶问题:max$$\text{s.t.}0\leq\alpha_i\leqC,\quad\foralli\\\sum_{i=1}^{n}\alpha_iy_i=0$$5.3.3解决对偶问题对偶问题是一个凸优化问题,可以使用各种优化算法来求解,如序列最小优化(SMO)算法或内点法(InteriorPointMethod)。一旦求解出α,就可以计算出w和b,从而得到SVM分类器。5.3.4示例代码下面是一个使用Python和Scikit-Learn库实现软间隔SVM的示例代码:importnumpyasnp

fromsklearnimportdatasets

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.svmimportSVC

fromsklearn.metricsimportclassification_report

#加载数据集

data=datasets.load_iris()

X=data.data[data.target!=0,:2]#选择两个特征和两个类别

y=data.target[data.target!=0]

y[y==1]=-1#将类别标签调整为-1和1

#划分训练集和测试集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)

#创建SVM分类器

clf=SVC(kernel='linear',C=1.0)

#训练模型

clf.fit(X_train,y_train)

#预测测试集

y_pred=clf.predict(X_test)

#输出分类报告

print(classification_report(y_test,y_pred))在这个例子中,我们使用了Iris数据集的两个特征和两个类别,创建了一个线性核的SVM分类器,并设置了C=通过调整C参数,可以观察到模型在训练数据和测试数据上的表现如何变化,从而找到最佳的C值。例如,可以使用网格搜索(GridSearch)或随机搜索(RandomSearch)来自动选择C值。6SVM的实践与案例分析6.11SVM在Python中的实现在Python中,scikit-learn库提供了强大的SVM实现。下面的示例展示了如何使用scikit-learn的SVC类来训练一个SVM分类器,并在简单的数据集上进行预测。#导入必要的库

fromsklearnimportdatasets

fromsklearn.model_selectionimporttrain_test_split

fromsklearn.preprocessingimportStandardScaler

fromsklearn.svmimportSVC

fromsklearn.metricsimportaccuracy_score

#加载数据集

iris=datasets.load_iris()

X=iris.data[:,[2,3]]#只选择花瓣长度和宽度作为特征

y=iris.target

#划分训练集和测试集

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)

#数据预处理:特征缩放

sc=StandardScaler()

sc.fit(X_train)

X_train_std=sc.transform(X_train)

X_test_std=sc.transform(X_test)

#创建SVM分类器

svm=SVC(kernel='linear',C=1.0,random_state=0)

svm.fit(X_train_std,y_train)

#预测

y_pred=svm.predict(X_test_std)

#计算准确率

print('Accuracy:%.2f'%accuracy_score(y_test,y_pred))6.1.1示例解释数据加载:使用scikit-learn的load_iris函数加载鸢尾花数据集。数据选择:仅选择花瓣长度和宽度作为特征,以简化问题。数据划分:使用train_test_split函数将数据集划分为训练集和测试集。特征缩放:SVM对特征尺度敏感,因此使用StandardScaler进行特征缩放。模型训练:使用SVC类创建SVM分类器,选择线性核函数和正则化参数C。预测与评估:在测试集上进行预测,并使用accuracy_score计算预测准确率。6.22SVM参数调优技巧SVM的性能受多个参数影响,包括核函数类型、正则化参数C、核函数参数(如gamma)。调优这些参数可以显著提高模型的性能。6.2.1核函数类型线性核:适用于线性可分的数据。多项式核:可以处理非线性数据,但计算成本高。高斯核(RBF):适用于非线性数据,是最常用的核函数。6.2.2正则化参数CC值较小,模型对错误的容忍度高,边界较宽,可能欠拟合。C值较大,模型对错误的容忍度低,边界较窄,可能过拟合。6.2.3核函数参数gammagamma值较小,决策边

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论