You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用meshgrid或contour绘制二分类器的Sigmoid决策边界线?

不用meshgrid/contour绘制决策边界线的方案

当然可以!你想要的那种仅显示决策边界曲线的效果,核心是找到模型预测概率等于0.5的所有点(因为sigmoid输出0.5对应线性组合的输入为0,这正是分类的分界点),然后把这些点连接成线就行,完全不需要网格或等高线工具。

先给你适配你的两层模型的具体实现代码,替换掉原来meshgrid和contour的部分:

import numpy as np
import matplotlib.pyplot as plt

# 定义函数:给定x1,找到对应的x2使得模型输出为0.5(即z2=0)
def get_boundary_x2(x1):
    # 目标:找到x2让z2 = np.dot(h1, w2_pred) + b2_pred = 0
    def target_func(x2):
        x = np.array([x1, x2]).reshape(1, 2)
        z1 = np.dot(x, w1_pred) + b1_pred
        h1 = 1 / (1 + np.exp(-z1))
        z2 = np.dot(h1, w2_pred) + b2_pred
        return z2

    # 在y特征的取值范围内用二分法求解
    y_min = xbatch[:, 1].min() - 0.5
    y_max = xbatch[:, 1].max() + 0.5
    # 迭代100次足够得到精确结果
    for _ in range(100):
        y_mid = (y_min + y_max) / 2
        val = target_func(y_mid)
        if val > 0:
            y_max = y_mid
        else:
            y_min = y_mid
    return (y_min + y_max) / 2

# 生成x1轴的采样点
x1_points = np.linspace(xbatch[:, 0].min() - 0.5, xbatch[:, 0].max() + 0.5, 100)
# 计算每个x1对应的边界x2
x2_points = np.vectorize(get_boundary_x2)(x1_points)

# 绘制训练数据和决策边界线
plt.scatter(xbatch[:, 0], xbatch[:, 1], c=ybatch, s=40, edgecolors="grey", alpha=0.9)
plt.plot(x1_points, x2_points, color='black', linewidth=2)  # 这就是你要的决策边界曲线
plt.show()

思路解释

  1. 决策边界的本质:对于你的带隐藏层的模型来说,决策边界对应y_hat=0.5的点,也就是z2=0(因为sigmoid(0)=0.5)。我们需要找到所有满足这个条件的(x1,x2)组合。
  2. 数值求解:因为你的模型是非线性的(中间经过了sigmoid激活),没法直接写出x2关于x1的解析表达式,所以用二分法在x2的取值范围内找到对应每个x1的解,这样就能得到曲线上的一系列点。
  3. 绘制曲线:用plt.plot()把这些点连接起来,就得到了你想要的简洁决策边界线,完全不用meshgrid或contour。

如果是简单的单逻辑回归模型(没有隐藏层),那决策边界是直线,直接解方程w1*x1 + w2*x2 + b = 0得到x2 = (-w1*x1 -b)/w2,直接plot直线就行,会更简单~

内容的提问来源于stack exchange,提问作者slimboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:03:53