1、核函数的概念
处理非线性数据问题本质是依靠升维(按照某种规则扩充数据的特征)使得原本在低维空间内线性不可分的数据在升维后的空间内变得线性可分。SVM的核函数 主要是为解决数据线性不可分而提出一系列变换函数,不同的特征扩充规则对应了了不同的核函数。
在实际应用 核SVM 的时候,往往是通过变形 线性SVM的目标函数 为适用核函数的效率形式:如
这里适用多项式核的SVM优化目标 max∑mi=1αi−12∑mi=1∑mj=1αiαjyiyj⋅xixj 函数内嵌套了i,j两层加法循环,每次循环都是对样本集内的任意两个样本 x(i),x(j)做一次点乘。对于这样的点乘运算,核函数 的思想在于直接通过变换K处理使得原始特征的点积结果与对两样本添加构造特征后计算的点积结果相类似的效果。这样相比起先添加构造特征提升数据维度,再应用线性SVM 。在SVM原始优化目标里直接以函数变换 K 来计算升维后两样本 x′ix′j的内积结果,不但降低了添加构造特征带来的硬件资源消耗,还进一步提升了运算效率。所以 核函数 本质只是一个在算法里提升效率的运算技巧(Kernel Trick)。
核函数 技巧一般多应用在两向量的内积处理上。
2、多项式核函数
一般数学形式:K(X,Y)=(X⋅Y+C)d ,
基本原理就是通过添加多项式特征来进行数据升维,用核函数重新定义了两向量的点乘结果。
推导如下:
对于核函数 K(X,Y)=(X⋅Y+1)2
∵X⋅Y=(x1,x2,...,xn)⋅(y1,y2,...,yn)=∑ni=1xiyi
∴(X⋅Y+1)2=(∑ni=1xiyi+1)2=∑ni=1(x2i)(y2i)+∑ni=2∑i−1j=1(√2xixj)(√2yiyj)+∑ni=1(√2xi)(√2yi)+1从而在(X⋅Y+1)2的结果里可以看到基于X,Y的原始特征添加了最高2次项的构造特征 x2i,xixj,xi,并对两向量对应位置的分类进行了乘法运算和求和,也就是相当于一步完成了对X,Y添加构造特征升维再算内积的运算。
当d=1时就对应了不使用添加构造特征 线性核函数 K(X,Y)=XY。
2.2 在SVM中应用多项式核函数
### Polynomial Features
from sklearn.preprocessing import PolynomialFeatures,StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
def Polynomial_KernelSVC(degree,C = 1.0):
return Pipeline([
("std_scaler",StandardScaler()),
("kernelSVC",SVC(kernel="poly",degree=degree,C = C))
])
poly_kernel_SVC = Polynomial_KernelSVC(degree = 1)
poly_kernel_SVC.fit(X,y)
AI 代码解读
3、高斯核函数(RBF)
一般数学形式:K(x,y)=e−γ‖x−y‖2 ,又称为RBF核(Radial Basis Functiona Keral), 径向基函数。
高斯核函数本身也是一个非常好的相似性度量函数:
- 当两样本非常 相距非常近 的时候就有‖x−y‖2→0,e−γ‖x−y‖2→1
- 当两样本非常 相距非常远 的时候就有‖x−y‖2→+∞,e−γ‖x−y‖2→0
在SVM中引入的 高斯核函数 本质作用也是一种升维处理,不过规则上不是通过添加多项式的处理方式,高斯核函数所做的事情是将当前数据集内的每一个样本作为 地标(landmark) 参考生成新特征,这个新构造的特征实际上反映了两样本点的相似性程度,从而在新特征空间内使得样本变得可分。由于高斯核函数升为变换将一个 m∗n的数据映射成m∗m的数据,所以在实际应用的时候会面临很高的算力开销,它的主要应用场景是样本集内特征数量比样本数量要多的时候$(m
高斯核函数形式上类似于统计学上的高斯函数 g(x)=1σ√2πe−12(x−μ)2 。
高斯 12σ2 在高斯核函数里被描述成 γ,反映在决策边界上γ越大,模型的泛化出现过拟合,γ越小,模型的出现欠拟合。所以γ实际控制了高斯核SVM模型的泛化能力。
应用高斯核可以获得更为多样化的决策边界形状,并且只有一个控制超参数(gamma),相比多项式核容易选择。但存在可解释性差,无法获取超平面方程 wTx+b=0 所需的参数w,b。3.2 在SVM中应用高斯核函数
### Polynomial Features from sklearn.preprocessing import PolynomialFeatures,StandardScaler from sklearn.svm import SVC from sklearn.pipeline import Pipeline def RBF_KernelSVC(gamma = 1): return Pipeline([ ("std_scaler",StandardScaler()), ("kernelSVC",SVC(kernel="rbf",gamma = gamma)) ]) rbf_kernel_SVC = RBF_KernelSVC(gamma = 1) rbf_kernel_SVC.fit(X,y)
AI 代码解读