核支持向量机
在线性模型那里,我们学习了将线性支持向量机用于分类任务。和支持向量机 (SVM) 是可以推广到更复杂模型的扩展,这些模型无法被输入控件的超平面定义,他既可以回归也可以分类,用于分类的情况在SVC中实现,用于回归的在SVR中实现。可以阅读Hastie、Tibshirani 和 Friedman 合著的《统计学基础》一书的第12章。
1.线性模型与非线性特征
线性模型在低维空间容易受限,为了让线性模型更加灵活,我们向式子添加更多特征,比如添加输入特征的交互项或多项式。
from sklearn.datasets import make_blobs
X, y = make_blobs(centers=4, random_state=8)
y = y % 2
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.show()
用于分类的线性模型只能用一条直线,无法给出较好的分类结果,如下。
from sklearn.svm import LinearSVC
linear_svm = LinearSVC().fit(X, y)
mglearn.plots.plot_2d_separator(linear_svm, X)
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.show()
我们对输入特征进行扩展,将每个数据点表示为三维数据点 (feature0, feature1, feature1 ** 2) ,从而标示出一个三维图。
# 添加第二特征的平方,作为一个新特征
X_new = np.hstack([X, X[:, 1:] ** 2])
from mpl_toolkits.mplot3d import Axes3D, axes3d
figure = plt.figure()
# 3D可视化
ax = Axes3D(figure, elev=-152, azim=-26)
# 首先画出所有 y==0 的点,然后画出所有 y==1 的点
mask = y == 0
ax.scatter(X_new[mask, 0], X_new[mask, 1], X_new[mask, 2],
c='b', cmap=mglearn.cm2, s=60)
ax.scatter(X_new[~mask, 0], X_new[~mask, 1], X_new[~mask, 2],
c='r', marker='^', cmap=mglearn.cm2, s=60)
ax.set_xlabel("feature 0")
ax.set_ylabel("feature 1")
ax.set_zlabel("feature1 ** 2")
plt.sh