1、线性模型与非线性特征
线性空间在低维空间中非常受限,这是因为线和平面的灵活性很受限。
import mglearn
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.svm import LinearSVC
X, y = make_blobs(centers=4, random_state=8)
y = y % 2
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()

Figure_2.png
通过上面的图,我们就能看到分类的线性模型,在通过一条直线来划分数据点,而对这个数据集却无法给出较好的结果。
现在我们对输入特征进行扩展,比如说添加第二个特征的平方(feature1 ** 2)作为一个新特征。现在我们将每个数据点表示为三维点(feature0, feature1, feature1 ** 2),而不是二维点 (feature0, feature1)。这个新的表示可以画成三维散点图:
import mglearn
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.svm import LinearSVC
from mpl_toolkits.mplot3d import Axes3D, axes3d
import numpy as np
X, y = make_blobs(centers=4, random_state=8)
y = y % 2
# 添加第二个特征的平方,作为一个新特征
X_new = np.hstack([X, X[:, 1:] ** 2])
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'