- 函数功能:用来绘制等高线和决策边界
- 调用方法:plt.contourf(X,Y,Z,cmap)
- 参数说明:
- X:网格点的横坐标
- Y:? 网格点的纵坐标
- Z:网格点的值(等高线图的高度值)
- cmap:颜色图,指定Z不同值(不同高度)所对应不同的填充色
一、绘制等高线图:
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(2)
x = np.arange(-5, 5, 0.1)
y = np.arange(-5, 5, 0.1)
xx, yy = np.meshgrid(x, y) # 生成网格点的横坐标xx与纵坐标yy
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2) # 三维中的高度值
ax1.contourf(xx, yy, z)
ax2.contour(xx, yy, z) # 与contourf区别在于不同高度面不填充颜色
plt.show()
?二、对于等高线图和网格点的理解:
等高线图实质上是三维图在二维平面上的映射,而网格点就是x,y轴所形成的平面上的点,由于z轴是基于二维上的,即指二维平面,而整个平面可以看成密密麻麻的网格点堆在一起形成的。
可通过np.meshgrid(x,y)函数生成网格点坐标,函数返回网格点的横坐标和纵坐标的两个数组
?
?由上图可知,当网格点数目多的时候就形成了面,x和y相当于一维线,然后通过np.meshgrid生成网格点,可理解为两条线围成一个面,所有的三维图都是基于网格点绘制的
三、在机器学习中绘制决策边界:
在机器学习中经常需要分析观察决策边界,在此举一个机器学习的小案例并绘制决策边界:
import numpy as np
import pandas as pd
import sklearn
from sklearn import datasets,model_selection
from sklearn.svm import SVC # 支持向量机分类模型
from sklearn.preprocessing import MinMaxScaler # 数据归一化函数
def data_plot():
# 使用葡萄酒数据集
wine = datasets.load_wine()
wine_data = wine.data
data = pd.DataFrame(wine_data,columns = wine.feature_names)
target = wine.target
# 选取前两个特征作为数据
data = data.iloc[:,:2]
scaler = MinMaxScaler() # 归一化特征函数
data = scaler.fit_transform(data) # 对特征数据进行归一化
# 根据两个特征数据绘制散点图
plt.scatter(data[:,0],data[:,1],c = target,s= 50, cmap = plt.cm.plasma,edgecolors = 'k')
plt.xlim(-0.5,1.5)
plt.ylim(-0.5,1.5)
plt.show()
# 划分数据集
x_train, x_test, y_train,y_test = model_selection.train_test_split(data,target,test_size = 0.2,random_state = 100)
# 创建支持向量机模型
svc = SVC()
# 训练模型
svc.fit(x_train,y_train)
print('模型在测试集上的准确率:',svc.score(x_test,y_test))
print('-'*120)
# 构建生成网格点的函数
def make_meshgrid(x,y):
x_min, x_max = x.min()-0.5,x.max()+0.5
y_min, y_max = y.min()-0.5,y.max()+0.5
xx,yy = np.meshgrid(np.linspace(x_min,x_max,300),np.linspace(y_min,y_max,500))
return xx,yy
# 对网格点进行预测并得到标签类别
xx,yy = make_meshgrid(data[:,0],data[:,0])
xy = np.c_[xx.ravel(),yy.ravel()]
z = model2.predict(xy).reshape(xx.shape)
# 绘制决策边界
fig = plt.figure()
ax = fig.add_subplot(111)
print('绘制决策边界:')
plt.scatter(data[:,0],data[:,1],c = target,s= 50, cmap = plt.cm.plasma,edgecolors = 'k')
ax.contourf(xx,yy,z,cmap = plt.cm.plasma,alpha =0.5)
plt.show()
# 调用函数
data_plot()
?
|