核函数能够帮助我们解决三个问题:
第一,有了核函数之后,我们无需去担心究竟应该是什么样,因为非线性SVM中的核函数都是正定核函数(positive definite kernel functions),他们都满足美世定律(Mercer's theorem),确保了高维空间中任意两个向量的点积一定可以被低维空间中的这两个向量的某种计算来表示(多数时候是点积的某种变换)。
clf = SVC(kernel = "rbf").fit(X,y)
plt.scatter(X[:,0],X[:,1],c=y,s=50, cmap="rainbow")
plot_svc_decision_function(clf)
对比其他:
2.2.3探索核函数在不同数据集上的表现
除了"linear"以外的核函数都能够处理非线性情况,那究竟什么时候选择哪一个核函数呢?遗憾的是,关于核函数在不同数据集上的研究甚少,谷歌学术上的论文中也没有几篇是研究核函数在SVM中的运用的,更多的是关于核函数在深度学习,神经网络中如何使用。在sklearn中,也没有提供任何关于如何选取核函数的信息。
但无论如何,我们还是可以通过在不同的核函数中循环去找寻最佳的核函数来对核函数进行一个选取。接下来我们就通过一个例子,来探索一下不同数据集上核函数的表现。我们现在有一系列线性或非线性可分的数据,我们希望通过绘制SVC在不同核函数下的决策边界并计算SVC在不同核函数下分类准确率来观察核函数的效用。
1. 导入所需要的库和模块
#1. 导入所需要的库和模块
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import svm
from sklearn.datasets import make_circles, make_moons, make_blobs,make_classification
2. 创建数据集,定义核函数的选择
#2. 创建数据集,定义核函数的选择
n_samples = 100#样本总量100
datasets = [
make_moons(n_samples=n_samples, noise=0.2, random_state=0),#月亮
make_circles(n_samples=n_samples, noise=0.2, factor=0.5, random_state=1),#环形
make_blobs(n_samples=n_samples, centers=2, random_state=5),#簇
make_classification(n_samples=n_samples,n_features =2,n_informative=2,n_redundant=0, random_state=5)#两个特征
#需要被舍弃的特征是0
]
Kernel = ["linear","poly","rbf","sigmoid"]#核函数4个,需要4*4个图
#四个数据集分别是什么样子呢?
#画图的循环
for X,Y in datasets:
plt.figure(figsize=(5,4))
plt.scatter(X[:,0],X[:,1],c=Y,s=50,cmap="rainbow")