使用contour等高线画分类问题的分割线

import numpy as np
import matplotlib.pyplot as plt
 
# 生成一个 x,y 大小的网格
x = range(5)
y = range(5)

X, Y = np.meshgrid(x, y)
Z = \
[[0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 1, 0, 0],
 [0, 1, 1, 1, 0],
 [1, 1, 1, 1, 1]]

#进行这个转换是为了在图上描绘各个点, 和等高线本身没有关系.
grid = np.c_[X.ravel(), Y.ravel()]

#将矩阵 Z 上下翻转,使图形和数据看起来一致。
#在这里,0显示为蓝色的点;1显示为绿色的点。
Z= np.flipud(Z)

#grid的内容为从左到右,从下到上,一系列的坐标点,它的形状为(25,2).
#25为点的个数,2代表 x,y两个坐标.
#所以在这里把Z的值扁平化, 得到一个长度为25的一维list,用于描述各个点的颜色值(0或者1)
pt_color = np.ravel(Z)
print('grid.shape=', grid.shape)
print("pt_clolr.shape=", pt_color.shape)
#print('grid=\n', grid)

#在图上描绘各个点, 坐标值为grid里的值, 点的颜色由Z里的值来指定.
#winter是matplotlib里定义的一个从蓝到绿渐变的调色板, 在这里
#我们选取了两个端点的颜色, 即蓝色(0)和绿色(1).
#grid[:,0]: 截取grid里所有X的值; grid[:,1]Y的值.
plt.scatter(grid[:,0], grid[:,1], c=pt_color, cmap='winter')

#描绘等高线. 首先我们有X,Y定义的坐标点, 然后每个坐标点都有一个与之对应的 Z 值.
#在这里, Z的值要么为0(蓝色),要么为1(绿色).最后把所有由levels指定的0.5的值连起来,形成等高线.
#虽然我们在定义 X,Y,Z时都只使用了整数值, 但是你应该想象这些整数值之间还有许多平均细分出的小数值.
#以等高线顶点(坐标为x=2.0 y=2.5)为例, 绿色点(1)到蓝色点(0)之间, 还有0.9,0.8 ... 0.5,0.4 ... 0等一系列的点.
#当然0.9到0.8之间还可以再平均细分.
print("X=\n", X)
print("Y=\n", Y)
plt.contour(X, Y, Z, levels=[.5], colors='red')
plt.show()

#等高线在分类问题里,常用作类别之间的分割线. 比如这里,红色的分割线把绿色的点(可以看做是良品的数据)
#和蓝色的点(可以看做是瑕疵品的数据)分做了两类.

使用contour等高线画分类问题的分割线