Python 解释matplotlib轮廓函数
我试图用matplotlib轮廓函数绘制一个决策区域(基于逻辑回归的输出)。我正在使用的代码:Python 解释matplotlib轮廓函数,python,matplotlib,scikit-learn,logistic-regression,Python,Matplotlib,Scikit Learn,Logistic Regression,我试图用matplotlib轮廓函数绘制一个决策区域(基于逻辑回归的输出)。我正在使用的代码: subplot.contourf(x2, y2, P, cmap=cmap_light, alpha = 0.8) 其中x2和y2是通过numpy网格生成的两个二维矩阵。P是使用 P = clf.predict(numpy.c_[x2.ravel(), y2.ravel()]) P = P.reshape(x2.shape) p的每个元素都是基于逻辑回归输出的布尔值。渲染的绘图如下所示 我的问
subplot.contourf(x2, y2, P, cmap=cmap_light, alpha = 0.8)
其中x2和y2是通过numpy网格生成的两个二维矩阵。P是使用
P = clf.predict(numpy.c_[x2.ravel(), y2.ravel()])
P = P.reshape(x2.shape)
p的每个元素都是基于逻辑回归输出的布尔值。渲染的绘图如下所示
我的问题是,contourf函数如何知道根据布尔值的2D矩阵在何处绘制轮廓?(x2、y2只是numpy网格)我查阅了几次文档,但无法理解。为了说明发生了什么,下面是一个使用两个第一特征(萼片长度和宽度)的示例iris数据集的一部分 首先,根据给定数据(黑色轮廓点)计算回归。然后,对于覆盖数据的网格的每个点,计算预测(网格中的小点)。请注意,给定值和预测值只是数字0、1和2。(在问题中,仅使用0和1。) 最后一步是使用这些网格点作为输入,搜索预测值相等的区域轮廓。因此,在值为0的栅格点和值为1的栅格点之间绘制。另一个介于值1和2之间。
contourf
用统一的颜色填充线条之间的区域
由于网格点和它们的预测在问题的情节中没有可视化,因此突然出现的轮廓更难理解
从matplotlib导入pyplot作为plt
将numpy作为np导入
从sklearn.dataset导入加载
从sklearn.linear_模型导入逻辑回归
十、 y=加载虹膜(返回X\U y=真)
X=X[:,:2]
clf=逻辑回归(随机状态=0).拟合(X,y)
x2,y2=np.meshgrid(np.linspace(X[:,0].min()-.5,X[:,0].max()+.5,20),
np.linspace(X[:,1].min()-.5,X[:,1].max()+.5,20))
pred=clf.predict(np.c_x2.ravel(),y2.ravel())
cmap=plt.get_cmap('Set1',3)
plt.scatter(x2.ravel(),y2.ravel(),c=pred,s=10,cmap=cmap,label='Prediction on grid')
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=cmap,ec='black',label='给定值')
plt.contourf(x2,y2,预整形(x2.shape),cmap=cmap,alpha=0.4,Level=2,zorder=0)
plt.图例(ncol=2,loc=“下中心”,bbox\U至\U锚=(0.5,1.01))
plt.show()
PS:Aboutpred.reformate(x2.shape)
:
和x2
是给出每个网格点的x和y坐标的数组y2
和x2
被组织为2D数组,类似于它们所表示的网格(示例中为20x020)y2
- 但是,函数
需要其输入数组为1d。为此,我们使用了clf.predict
:它只是从2d数组中生成一个长的1d数组。在本例中,.ravel()
将20x20阵列转换为400的1d阵列ravel
pred=clf.predict的结果是一个对应的1d数组(400个元素)
将pred.reformate(x2.shape)
转换为与pred
和x2
相同的2d格式(同样是20x20)y2
- 请注意,
希望其参数为1d格式,它仅单独查看每个点<另一方面,code>contourf希望其参数为2d格式,因为它需要知道网格是如何组织的scatter
重塑(x2.shape)
和x2.ravel()
。