决策边界绘制函数plot_decision_boundary()和plt.contourf函数详解

在做吴恩达老师的深度学习课程作业时,发现决策边界函数不好理解plot_decision_boundary(model , X , y)。将此函数理解记录下:
作业地址:https://blog.csdn.net/u013733326/article/details/79702148
绘制梯度下降算法图形或是决策边界,核心便在于知道plt.contourf函数的用法

plt.contourf函数

这里参考https://blog.csdn.net/qq_44669578/article/details/103348076?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-8.nonecase

plt.contourf用来画出不同分类的边界线,也常常用来绘制等高线
1.生成数据点

x = np.arange(-5, 5, 1)
y = np.arange(0, 20, 2)
xx, yy = np.meshgrid(x, y)

在这里插入图片描述
2.对不同类的数据进行标记,即生成Z

z = np.square(xx) - yy > 0

在这里插入图片描述
3.生成边界图

plt.contourf(xx, yy, z, cmap=plt.cm.Spectral)
plt.scatter(xx, yy, c=z)
plt.show()

在这里插入图片描述
如果点设置得更密集一点,分界处会更光滑,可以看到完整的抛物线
在这里插入图片描述
完整代码

x = np.arange(-5, 5, 0.1)
y = np.arange(0, 20, 0.2)
xx, yy = np.meshgrid(x, y)

z = np.square(xx) - yy > 0
#plt.cm.Spectral,在这的意思就是颜色会随Z的值变化
plt.contourf(xx, yy, z, cmap=plt.cm.Spectral)
plt.scatter(xx, yy, c=z)
plt.show()

2.plot_decision_boundary()函数理解

先附上完整代码

def plot_decision_boundary(model, X, y):
    x_min, x_max = X[0, :].min() - 1, X[0, :].max() + 1
    y_min, y_max = X[1, :].min() - 1, X[1, :].max() + 1
    h = 0.01
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
 
    Z = model(np.c_[xx.ravel(), yy.ravel()]) 
    Z = Z.reshape(xx.shape)
    
    plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
    plt.ylabel('x2')
    plt.xlabel('x1')
    plt.scatter(X[0, :], X[1, :], c=np.squeeze(y), cmap=plt.cm.Spectral)

效果图
在这里插入图片描述
在这里插入图片描述

调用训练好的模型
在这里插入图片描述
绘制此决策边界的思路是:首先已经通过了神经网络拟合出了输入特征和标签的函数关系,然后生成间距很小的网格覆盖这些点(函数中用h表示网格点之间的距离),将网格的坐标送入训练好的神经网络,神经网络会为每个网格坐标输出一个预测值,注意,这个网格点非常多,占满了整张图,图中的红色和蓝色其实就是经过预测后的网格点所填充的颜色,以预测值0.5进行划分,预测值为0.5的这条线也即为红点和蓝点的区分线。

首先按照样本大小,以0.01的间距生成网格

 x_min, x_max = X[0, :].min() - 1, X[0, :].max() + 1
 y_min, y_max = X[1, :].min() - 1, X[1, :].max() + 1
 h = 0.01
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

然后用训练好的模型对网格上的所有的点进行预测,返回一个只含0/1的矩阵
然后改变矩阵Z的形状,因为在contourf函数中,当 X,Y,Z 都是 2 维数组时,它们的形状必须相同。

Z = model(np.c_[xx.ravel(), yy.ravel()])  #ravel()函数将多维降至一维,默认行优先
Z = Z.reshape(xx.shape)

然后画图,plt.cm.Spectral,在这的意思就是颜色会随Z的值变化

plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
plt.ylabel('x2')
plt.xlabel('x1')
plt.scatter(X[0, :], X[1, :], c=np.squeeze(y), cmap=plt.cm.Spectral)
  • 46
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,下面是一个关于plot_decision_boundary函数的例子,它用于绘制一个简单的二类问题的决策边界: ```python import numpy as np import matplotlib.pyplot as plt def plot_decision_boundary(model, X, y, cmap='RdBu', alpha=0.5, h=0.01, ax=None, title=None): """ 绘制二维类器的决策边界 """ # 确定坐标系 x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5 y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) # 预测决策边界 Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) # 绘制决策边界和训练数据 if ax is None: fig, ax = plt.subplots(figsize=(8, 6)) ax.contourf(xx, yy, Z, cmap=cmap, alpha=alpha) ax.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap, edgecolor='k') # 设置坐标轴和标题 ax.set_xlim(xx.min(), xx.max()) ax.set_ylim(yy.min(), yy.max()) ax.set_xlabel('x1') ax.set_ylabel('x2') if title is not None: ax.set_title(title) # 创建一些随机数据 np.random.seed(0) X = np.random.randn(100, 2) y = np.logical_xor(X[:, 0] > 0, X[:, 1] > 0) # 训练一个简单的类器 from sklearn.linear_model import LogisticRegression clf = LogisticRegression() clf.fit(X, y) # 绘制决策边界 plot_decision_boundary(clf, X, y, cmap='RdBu', alpha=0.5, h=0.02, title='Logistic Regression') ``` 上面的代码会生成一张图片,绘制了一个简单的二类问题的决策边界。其中,X是一个二维数组,表示二维平面上的点的坐标;y是一个一维数组,表示每个点的真实标签;clf是一个训练好的逻辑回归类器;cmap是一个字符串,指定绘图时使用的颜色映射;alpha是一个浮点数,指定绘制的透明度;h是一个浮点数,指定绘制辨率;ax是一个matplotlib.axes.Axes对象,指定绘制的坐标系;title是一个字符串,指定绘制的标题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值