非线性SVM模型
非线性支持向量机(SVM)是为了处理线性不可分数据而设计的。它通过使用核函数将数据映射到一个高维空间,在这个高维空间中,数据变得线性可分,从而实现分类。常见的核函数包括多项式核、径向基函数(RBF)核和 sigmoid 核等。
非线性 SVM 的优化目标
与线性 SVM 类似,非线性 SVM 通过引入核函数,将原始数据映射到高维空间,在高维空间中找到一个超平面来实现分类。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
import warnings
with warnings.catch_warnings():
warnings.simplefilter("ignore")
X, y = datasets.make_moons(noise=0.15, random_state=666)
plt.scatter(X[y==0,0], X[y==0,1])
plt.scatter(X[y==1,0], X[y==1,1])
plt.show()
线性核函数
def LinearSVC():
return Pipeline([
("std_scaler", StandardScaler()),
("svc", SVC(kernel="linear"))
])
linear_svc = LinearSVC()
linear_svc.fit(X, y)
vars(linear_svc)
{'steps': [('std_scaler', StandardScaler()), ('svc', SVC(kernel='linear'))],
'memory': None,
'verbose': False}
def plot_decisionboundary(model, X):
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, 0.02),
np.arange(y_min, y_max, 0.02))
predict = model.predict(np.c_[xx.ravel(), yy.ravel()])
predict = predict.reshape(xx.shape)
from matplotlib.colors import ListedColormap
plt.contourf(xx, yy, predict, cmap=ListedColormap(['#CCCCFF', '#EF9A9A', '#90CAF9']))
plot_decisionboundary(linear_svc, X)
plt.scatter(X[y==0, 0], X[y==0,1], color='r')
plt.scatter(X[y==1, 0], X[y==1,1], color='b')
plt.show()
多项式核函数
def PolyKernelSVC(degree):
return Pipeline([
("std_scaler", StandardScaler()),
("svc", SVC(kernel="poly", degree =degree, coef0=1,C=5))
])
polykernelsvc = PolyKernelSVC(degree=5)
polykernelsvc.fit(X, y)
vars(polykernelsvc)
{'steps': [('std_scaler', StandardScaler()),
('svc', SVC(C=5, coef0=1, degree=1, kernel='poly'))],
'memory': None,
'verbose': False}
plot_decisionboundary(polykernelsvc, X)
plt.scatter(X[y==0, 0], X[y==0,1], color='r')
plt.scatter(X[y==1, 0], X[y==1,1], color='b')
plt.show()
polykernelsvc = PolyKernelSVC(degree=1)
polykernelsvc.fit(X, y)
plot_decisionboundary(polykernelsvc, X)
plt.scatter(X[y==0, 0], X[y==0,1], color='r')
plt.scatter(X[y==1, 0], X[y==1,1], color='b')
plt.show()
高斯核函数(RBF Kernel)
## 需要调参的参数是gamma
def RBFKernelSVC(gamma):
return Pipeline([
("std_scaler", StandardScaler()),
("svc", SVC(kernel="rbf", gamma=gamma))
])
rbf_svc = RBFKernelSVC(gamma=1)
rbf_svc.fit(X, y)
vars(rbf_svc)
{'steps': [('std_scaler', StandardScaler()), ('svc', SVC(gamma=1))],
'memory': None,
'verbose': False}
plot_decisionboundary(rbf_svc, X)
plt.scatter(X[y==0, 0], X[y==0,1], color='r')
plt.scatter(X[y==1, 0], X[y==1,1], color='b')
plt.show()
rbf100_svc = RBFKernelSVC(gamma=100)
rbf100_svc.fit(X, y)
plot_decisionboundary(rbf100_svc, X)
plt.scatter(X[y==0, 0], X[y==0,1], color='r')
plt.scatter(X[y==1, 0], X[y==1,1], color='b')
plt.show()
rbf01_svc = RBFKernelSVC(gamma=0.1)
rbf01_svc.fit(X, y)
plot_decisionboundary(rbf01_svc, X)
plt.scatter(X[y==0, 0], X[y==0,1], color='r')
plt.scatter(X[y==1, 0], X[y==1,1], color='b')
plt.show()