C支持向量分类理解

时间:2017-06-27 12:55:30

标签: matplotlib scipy scikit-learn

我有一个关于代码剪切的问题,我找到了一本书。 作者创建了两类样本点。接下来,作者学习模型并将SVC模型绘制到“blob”上。 这是代码剪辑:

# create 50 separable points
X, y = make_blobs(n_samples=50, centers=2,
                  random_state=0, cluster_std=0.60)

# fit the support vector classifier model
clf = SVC(kernel='linear')
clf.fit(X, y)

# plot the data
fig, ax = plt.subplots(figsize=(8, 6))
point_style = dict(cmap='Paired', s=50)
ax.scatter(X[:, 0], X[:, 1], c=y, **point_style)

# format plot
format_plot(ax, 'Input Data')
ax.axis([-1, 4, -2, 7])


# Get contours describing the model
xx = np.linspace(-1, 4, 10)
yy = np.linspace(-2, 7, 10)
xy1, xy2 = np.meshgrid(xx, yy)
Z = np.array([clf.decision_function([t])
              for t in zip(xy1.flat, xy2.flat)]).reshape(xy1.shape)

line_style = dict(levels = [-1.0, 0.0, 1.0],
                  linestyles = ['dashed', 'solid', 'dashed'],
                  colors = 'gray', linewidths=1)

ax.contour(xy1, xy2, Z, **line_style)

结果如下:

Image 1

现在我的问题是,我们为什么要创建“xx”和“yy”以及“xy1”和“xy2”?因为实际上我们想要为X和y数据显示SVC“函数”,如果我们将xy1和xy2以及Z(也是用xy1和xy2创建)传递给meshgrid函数来绘制meshgrid,则没有与学习SVC模型的数据的连接......不是吗?

有人可以向我解释这个问题,或者建议如何更轻松地解决这个问题?

感谢您的回答

1 个答案:

答案 0 :(得分:1)

我将从简短的答案开始。 ax.contour()只是绘制分离超平面及其“平行”平面的一种方法。您当然可以通过计算平面来绘制它,例如this example

要回答你的上一个问题,在我看来,它已经是一个相对简单的(数学和逻辑)和简单(编码)方式来绘制你的模型。当您的分离超平面在数学上不易描述时(例如用于非线性分离的多项式和RBF内核),如this example,它尤其有用。

要解决您的第二个问题和评论,并回答您的第一个问题,是的,您是对的,xxyyxy1xy2和{{ 1}}所有与你的(模拟blob)数据的连接非常有限。它们用于绘制超平面来描述您的模型。

那应该回答你的问题。但请允许我在此处提供更多详细信息,以防其他人不熟悉您的主题。您的数据与Zxxyyxy1xy2之间的唯一关联是:

  1. Zxxyyxy1对模拟数据周围的区域进行抽样。具体而言,模拟数据以2. xy2为中心设置了xx(-1, 4)之间的限制,设置yy之间的限制。可以通过(-2, 7)检查“meshgrid”。
  2. ax.scatter(xy1, xy2)是“meshgrid”中所有采样点的计算。它计算从采样点到分离超平面的归一化距离。 Z是等高线图上的等级。
  3. Z然后使用“meshgrid”和ax.contour绘制轮廓线。以下是一些要点:

    1. Zxy1都是2-D,用于指定曲面的(x,y)坐标。他们逐行列出该区域的样本点。
    2. xy2是一个二维数组,其形状与Zxy1相同。它定义了每个点的水平,以便程序可以“理解”三维表面的形状。
    3. xy2表示在相应的绘制水平上有3条曲线(在这种情况下为直线)。与SVC相关,0级是分离超平面;级别-1和1非常接近(相差ζi)到分离超平面的最大边距。
    4. levels = [-1.0, 0.0, 1.0]表示分离的hyperplan绘制为实线,两侧的两个平面绘制为虚线。
    5. 编辑(响应评论):

      在数学上,决策函数应该是一个符号函数,告诉我们一个点是0级或1级,如你所说。但是,当您检查linestyles = ['dashed', 'solid', 'dashed']中的值时,您会发现它们是连续数据。 decision_function(X)的工作方式是值的符号表示分类,而绝对值是“样本X到分离超平面的距离”,它反映了预测的置信度/有效性(种类)分类。这对于模型图是至关重要的。如果Z是分类的,那么您将获得轮廓线,使得区域像网格而不是单个轮廓线。它就像the example中的colormesh;但你不会在Z看到它,因为它不是轮廓图的正确行为。