如何使用判别函数绘制3个类之间的决策边界

时间:2018-02-06 08:58:51

标签: python matplotlib plot

我有3个判别函数将2D空间划分为3个区域。我想绘制这些地区之间的决策边界。我无法弄清楚如何在python中使用matplotlib meshgrid。

在2判别函数的情况下,过程很简单。我计算0的函数和等值线图之间的差异。

lin_param = (-5, 5, 100)
xx = np.linspace(*lin_param)
yy = np.linspace(*lin_param)

x, y = np.meshgrid(xx, yy)

z = g1(x, y) - g2(x, y)
cp = plt.contour(x, y, z, levels=[0], colors="k")

plt.scatter(0, 0)
plt.scatter(2, 2)
plt.show()

其中g1和g2是具有平均值(0,0)和(2,2)的多元高斯分布。 (分布并不重要,我想将其应用于任何判别函数)

def pdf(x, y, mean, cov):
  var = multivariate_normal(mean=mean, cov=cov)
  pos = np.empty(x.shape + (2,))
  pos[:, :, 0] = x; pos[:, :, 1] = y
  return var.pdf(pos)

def g1(x, y):
  return pdf(x, y, mean=[0,0], cov=[[1,0],[0,1]])

def g2(x, y):
  return pdf(x, y, mean=[2,2], cov=[[1,0],[0,1]])

def g3(x, y):
  return pdf(x, y, mean=[-2,2], cov=[[1,0],[0,1]])

Decision boundaries between two classes

这里一方是负面而另一面是正面。沿决策边界的值均为零。现在我要添加第三个函数g3,其均值为(-2,2)。绘制结果决策边界并不简单。我尝试取3个函数的最大值2,并将它们的差值指定为z值,但无法达到我想要的效果。

我希望看到的内容与下图类似:

Desired output with 3 function

是否可以通过类似的网格 - 等高线图方法实现它?我不想明确计算这一行。

更新

通过使用contourf方法,区域可以填充不同的颜色。但是,绘制边界线仍然存在问题。

Fill Plot

1 个答案:

答案 0 :(得分:1)

我认为我获得了理想的输出。

我没有将函数之间的差异分配给z数组,而是指定了具有最大值的函数索引。然后我在类标签(或函数索引)之间使用数字作为级别参数。例如,要绘制0级和1级之间的边界,我将0.5添加到levels参数。

z = np.array((g1(x, y), g2(x, y), g3(x, y)))
z = np.argmax(z, axis=0)
cp = plt.contour(x, y, z, colors="k", levels=[0.5, 1.5, 2.5])

enter image description here