matplotlib可视化之等高线图plt.contourf()与机器学习中绘制决策边界

  • 函数功能:用来绘制等高线和决策边界
  • 调用方法: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()

猜你喜欢

转载自blog.csdn.net/weixin_46707493/article/details/119843991
今日推荐