【问题标题】:How to plot decision boundaries between 3 classes using discriminant functions如何使用判别函数绘制 3 个类之间的决策边界
【发布时间】:2018-07-16 06:44:11
【问题描述】:

我有 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]])

这里一侧是负的,另一侧是正的。沿决策边界的值都为零。现在我要添加第三个函数 g3,其均值为 (-2, 2)。绘制由此产生的决策边界并不简单。我尝试取 3 个函数的最大 2 个值并将它们的差异分配为 z 值,但无法实现我想要的。

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

是否可以使用类似的网格轮廓图方法来实现它?我不想明确计算线。

更新

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

【问题讨论】:

  • 你见过this post吗?尤其是第一个答案中的this link
  • @ThomasKühn 谢谢。是的,我看到了,但是在您发表评论后,我进一步检查并玩了张贴在那里的 sn-ps。该链接显示了如何绘制不同的区域(问题已相应更新),但我没有画出边界线。虽然这对我来说已经足够好了,但我不会结束这个问题,看看是否有人设法划清界限。

标签: python matplotlib plot


【解决方案1】:

我认为我达到了预期的输出。

我没有将函数之间的差异分配给 z 数组,而是分配了具有最大值的函数的索引。然后我使用类标签(或函数索引)之间的数字作为级别参数。例如,为了在 0 类和 1 类之间绘制边界,我在 levels 参数中添加了 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])

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 2021-05-17
    • 2012-12-13
    • 2014-08-07
    • 2013-10-03
    • 2021-07-30
    • 2022-06-16
    • 2017-03-31
    相关资源
    最近更新 更多