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

4
我有3个判别函数,将2D空间分成3个区域。我想绘制这些区域之间的决策边界。但是,我不知道如何使用Python中的matplotlib网格来实现这一点。
如果是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]])

两类之间的决策边界

这里一侧为负,另一侧为正。决策边界上的值都是零。现在我想添加第三个函数g3,其均值为(-2, 2)。绘制结果的决策边界并不直观。我试图取三个函数的最大值,并将它们之间的差作为z值,但没有达到我想要的效果。

我希望看到的东西类似于下面的图片:

带有3个函数的所需输出

使用类似的网格和等高线图方法是否可以实现?我不想明确计算该线路。

更新

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

填充图


你看过这篇帖子吗?特别是第一个答案中的这个链接 - Thomas Kühn
@ThomasKühn 谢谢。是的,我看到了,但在您的评论之后,我进一步检查并尝试了那里发布的片段。该链接显示了如何绘制不同区域(问题已相应更新),但我没有成功绘制边界线。虽然对我来说已经足够好了,但我不会关闭问题,以查看是否有人成功绘制边界线。 - Seljuk Gulcan
1个回答

1

我认为我已经实现了预期的输出。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接