1. 3种SVM不同核函数介绍
线性核函数linear
适用范围:
主要用于线性可分的情况。
特点:
其特征空间到输入空间的维度是一样的,参数少速度快,可解释性强
,可以比较容易的知道哪些特征是重要的。
它对于线性可分情况分类效果比较理想,因此我们通常会先尝试用线性核函数来做分类,看看效果如何,如果不行再换其他的核函数。
多项式核函数(poly)
适用范围:
可用于线性与非线性分类。
特点:
通过将低维的输入空间映射到高维的特征空间的方式,使得原本线性不可分的数据线性可分。
多项式核函数的参数较多,当多项式阶数比较高的时候,核矩阵的元素值将趋于无穷大或者无穷小,计算复杂度会大到无法计算。因此对于大数量级的幂数,不太适用,通常只用在已经大概知道一个比较小的幂数的情况。
高斯径向基核函数(rbf)
适用范围:
可用于线性与非线性分类。
特点:
高斯径向基核函数是一种局部性强的核函数,其可以将一个样本映射到一个更高维的空间内,该核函数是应用最广的一个,无论大样本还是小样本都有比较好的性能,而且其相对于多项式核函数参数要少,因此大多数情况下在不知道用什么核函数的时候,优先使用高斯核函数。
高斯径向基核函数只有一个参数,相比多项式核容易选择。缺点是可解释性差、计算速度比较慢、容易过拟合。
2. 使用不同SVM不同核函数对iris数据集进行分类
导入数据集并构建模型
svc_linear = SVC(kernel="linear") svc_rbf = SVC(kernel="rbf") svc_poly = SVC(kernel="poly")
# LinearSVC线性分类支持向量机,它是给根据liblinear实现的,可以用于二类分类,也可以用于多类分类 from sklearn.svm import LinearSVC linearSVC = LinearSVC()
from sklearn import datasets
iris = datasets.load_iris() data = iris.data[:,[2,3]] target = iris.target
# 画出样本点的散点图 plt.scatter(data[:,0],data[:,1],c=target)
# 用以上的模型进行训练 svc_linear.fit(data,target) svc_rbf.fit(data,target) svc_poly.fit(data,target) linearSVC.fit(data,target)
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, intercept_scaling=1, loss='squared_hinge', max_iter=1000, multi_class='ovr', penalty='l2', random_state=None, tol=0.0001, verbose=0)
画出不同核函数模型的决策区域
在平面上生成150000个待预测的点
xmin,xmax = data[:,0].min(),data[:,0].max() ymin,ymax = data[:,1].min(),data[:,1].max() x = np.linspace(xmin,xmax,500) y = np.linspace(ymin,ymax,300) xx,yy = np.meshgrid(x,y) xy = np.c_[xx.ravel(),yy.ravel()] xy.shape
(150000, 2)
使用上述4个模型进行预测
linear_y = svc_linear.predict(xy) rbf_y = svc_rbf.predict(xy) poly_y = svc_poly.predict(xy) linearSVC_y = linearSVC.predict(xy)
画出数据点的分类,即决策区域
plt.figure(figsize=(12,9)) y_ = [linear_y,rbf_y,poly_y,linearSVC_y] titles = ["linear","rbf","poly","linearSVC"] for i in range(len(y_)): axes = plt.subplot(2,2,i+1) axes.set_title(titles[i]) plt.pcolormesh(xx,yy,y_[i].reshape(xx.shape),cmap="rainbow") plt.scatter(data[:,0],data[:,1],c=target)
3. 使用3种不同核函数SVM回归器进行对比
from sklearn.svm import SVR import numpy as np import matplotlib.pyplot as plt %matplotlib inline
svr_linear = SVR(kernel="linear") #线性核函数 svr_rbf = SVR(kernel="rbf") # 高斯核函数 svr_poly = SVR(kernel="poly") #多项式核函数
# 构建数据集 x = np.sort(np.random.rand(120)*20).reshape((-1,1)) y = np.sin(x).reshape((-1)) y
array([ 0.00742162, 0.24751523, 0.3415653 , 0.34759352, 0.38696958, 0.4421328 , 0.55214074, 0.76303351, 0.87491982, 0.99823761, 0.99980917, 0.99761508, 0.9208189 , 0.65227279, 0.63461282, 0.6229594 , 0.52505248, 0.50287485, 0.46412807, 0.36936856, 0.24375237, -0.25350717, -0.26024696, -0.33279932, -0.56187501, -0.654529 , -0.77757274, -0.78186399, -0.79296189, -0.81952154, -0.83833383, -0.8532612 , -0.85372675, -0.95442008, -0.95631099, -0.97157723, -0.98316123, -0.99660268, -0.98940421, -0.88825406, -0.8761492 , -0.83140796, -0.72885609, -0.67636221, -0.50023083, -0.33547563, 0.02380919, 0.04284093, 0.09876885, 0.1511908 , 0.5148709 , 0.86849825, 0.92608232, 0.93889021, 0.99937328, 0.99066457, 0.58532639, 0.14879434, -0.10706485, -0.3945345 , -0.48553596, -0.72967251, -0.83200108, -0.85349259, -0.98519961, -0.91126438, -0.89261681, -0.58239636, -0.24621536, -0.21255149, 0.07973857, 0.14214009, 0.22297726, 0.43508214, 0.97500725, 0.99042149, 0.9999599 , 0.99801811, 0.91532541, 0.89571095, 0.85068955, 0.84204641, 0.53463984, 0.41512068, 0.29221854, 0.07522218, 0.05414875, -0.11536683, -0.21672657, -0.50645076, -0.57996269, -0.63090667, -0.68752594, -0.71803267, -0.77350908, -0.82268006, -0.89454294, -0.99754715, -0.98425531, -0.87872174, -0.87453792, -0.79748762, -0.70055025, -0.27372036, -0.25888483, -0.23745825, -0.18223377, -0.14449555, -0.0983766 , -0.04744317, 0.03364084, 0.25909822, 0.34909316, 0.56313943, 0.58188988, 0.66766334, 0.76456595, 0.77336481, 0.81083299, 0.88017043])
plt.scatter(x,y) • 1
<matplotlib.collections.PathCollection at 0x207ea6392b0>
y += np.random.randn(120)*0.5 • 1
让不同的核函数来训练样本
svr_linear.fit(x,y) svr_rbf.fit(x,y) svr_poly.fit(x,y)
SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto', kernel='poly', max_iter=-1, shrinking=True, tol=0.001, verbose=False)
x_test = np.linspace(0,20,200).reshape((200,1))
linear_y = svr_linear.predict(x_test) rbf_y = svr_rbf.predict(x_test) poly_y = svr_poly.predict(x_test)
plt.scatter(x,y) plt.plot(x_test,linear_y,c="g") #绿色:线性核函数 plt.plot(x_test,rbf_y,c="b") #蓝色:高斯核函数 plt.plot(x_test,poly_y,c='r') #红色:多项式核函数
可以看出,对于该案例,高斯核函数模型的预测效果好于其他2中核函数模型。
如果内容对你有帮助,感谢记得点赞+关注哦!