2017-06-27 39 views
0

我有一个关于代码被剪掉的问题,我发现我是一本书。 作者创建了两类采样点。接下来,作者学习一个模型并将SVC模型绘制到“斑点”上。 这是剪断代码:C支持向量分类理解

# 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

你检查过'''contour'''的文档吗?这是轮廓图的常用输入。这些线不是手动绘制的,轮廓在这里很重要,因此这种设置。 – sascha

+0

@sascha,谢谢。是的,我检查了轮廓文件。但为什么我们分别使用xx和xy xy1和xy2代替X和y?我的意思是xy1和xy2是从以下创建的人造阵列: xx = np.linspace(-1,4,10) yy = np.linspace(-2,7,10) xy1,xy2 = np.meshgrid(xx, yy)但是这个数字与我们从中创建“blob”的数据没有什么共同之处。那么我们为什么要使用它们呢? – 2Obe

回答

1

我会用短宽的答案开始。 ax.contour()只是绘制分离超平面及其“平行”平面的一种方式。你当然可以通过计算飞机来绘制它,如this example

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

为了解决第二个问题和意见,并回答你的第一个问题,是的,你说得对,xxyyxy1xy2Z一切都非常有限连接到您的(模拟斑点)的数据。它们用于绘制超平面来描述你的模型。

这应该回答你的问题。但是请允许我在这里提供一些更多的细节,以防其他人不熟悉这个话题。您的数据和xxyyxy1xy2之间的唯一连接,Z是:

  1. xxyyxy1xy2样品周围的模拟数据的区域。具体而言,以xx为中心的模拟数据在(-1, 4)yy之间设置限制,设置在(-2, 7)之间的限制。可以通过ax.scatter(xy1, xy2)检查“meshgrid”。
  2. Z是对“meshgrid”中所有采样点的计算。它计算从采样点到分离超平面的归一化距离。 Z是等高线图上的等级。

ax.contour然后使用“meshgrid”和Z来绘制轮廓线。这里有一些关键点:

  1. xy1xy2都是2-d指定(X,Y)的表面的坐标。他们逐行列出区域中的采样点。
  2. Z是一个与xy1xy2形状相同的二维阵列。它定义每个点的等级,以便程序可以“理解”三维曲面的形状。
  3. levels = [-1.0, 0.0, 1.0]表示在绘制的相应级别有3条曲线(在这种情况下为线条)。与SVC相关,0级是分离超平面;等级-1和1非常接近(相差ζi)到分离超平面的最大余量。
  4. linestyles = ['dashed', 'solid', 'dashed']表示将分离超平面绘制为实线,并将两侧的两个平面绘制为虚线。

编辑(在响应评论):

数学,决策函数应该是一个标志功能,告诉我们一个点为0级或1,如你所说。但是,当您检查Z中的值时,您会发现它们是连续的数据。 decision_function(X)的工作方式是,值的符号表示分类,而绝对值是“样本X到分离超平面的距离”,它反映(种类)预测分类的置信度/显着性。这对模型的情节至关重要。如果Z是分类的话,你可以得到轮廓线,使得一个区域像一个网格而不是一条轮廓线。它会像the example中的色网那样;但你不会看到ax.contour(),因为它不是轮廓图的正确行为。

+0

非常感谢。但要完全理解它,对我而言,仍然有一件事缺失。你说:“[...] xx,yy,xy1,xy2和Z都与你的(模拟斑点)数据连接非常有限[...]”。我是对的,即:1.我的数据和超平面之间唯一的“连接”是Z:Z = np.array([clf.decision_function([t]) for zip in zip(xy1.flat,xy2。 flat)])。reshape(xy1.shape) ? 2. Z为“meshgrid”中的每个点返回该点具有0或1的水平 - > Z可以这样做,因为clf“知道”哪个点是0,哪个点是1. – 2Obe

+0

关于你的两个想法:1)是的,你是对的。 'Z'包含从您的数据中“学习”的超平面的标准化距离。 2)部分正确。我会说'Z'中的值有2个信息,分类和信心。我的解释对于评论太长了。我把它放在我更新的答案中。 –