平行坐标可视化

  参考自《数据挖掘概念与技术》。

  对于有$m$个特征,$n$个样本的数据,平行坐标可视化图中,横轴均匀列出$m$个特征,每个特征生成一个纵轴,其中每个样本就表示为穿越这些纵轴的折线。实现代码如下:

import numpy as np
import matplotlib.pyplot as plt

def parallel_coordinates(data, line_c='black', axis_alpha = 0.5, line_alpha = 0.05):
    n, m = data.shape
    mi, ma = np.min(data, 0, keepdims=True), np.max(data, 0, keepdims=True)
    ma += (ma - mi == 0) # 防止零除
    data = (data - mi) / (ma - mi)
    # 创建一个 Figure 对象和一个 Axes 对象
    fig, ax = plt.subplots()
    ax.spines['right'].set_visible(False)
    ax.spines['top'].set_visible(False)
    ax.spines['left'].set_visible(False)
    ax.spines["bottom"].set_alpha(axis_alpha)
    ax.tick_params(axis='y', length=0, labelleft=False)
    ax.tick_params(axis='x', length=2, colors=(0, 0, 0, axis_alpha))
    ax.set_xticks(np.arange(m), np.arange(m), alpha = axis_alpha)
    ax.set_xlabel('Features')
    ax.set_ylabel('Values')
    # 画折线
    x = np.arange(m)
    for d in data:
        ax.plot(x, d, c=line_c, alpha=line_alpha)
    # 画坐标轴
    for i in range(m):
        ax1 = ax.twinx()
        ax1.spines['top'].set_visible(False)
        ax1.spines['left'].set_visible(False)
        ax1.spines['bottom'].set_visible(False)
        ax1.spines["right"].set_position(("data", i))
        ax1.spines["right"].set_alpha(axis_alpha)
        ax1.tick_params(axis='y', length=2, colors=(0, 0, 0, axis_alpha))
        ax1.set_ylim(ax.get_ylim())
        new_ticks = ['%.2f'%i for i in np.linspace(mi[0, i], ma[0, i], 5)]
        ax1.set_yticks(np.linspace(0, 1, 5), new_ticks, alpha = axis_alpha)
    plt.show()
# samp.shape = [n, m]
parallel_coordinates(samp)

  下图展示了45个标准异常检测数据集的1000个随机抽样(不重复)的前5个特征的可视化结果:

平行坐标可视化_第1张图片
平行坐标可视化_第2张图片
平行坐标可视化_第3张图片
平行坐标可视化_第4张图片
平行坐标可视化_第5张图片
平行坐标可视化_第6张图片
平行坐标可视化_第7张图片
平行坐标可视化_第8张图片
平行坐标可视化_第9张图片
平行坐标可视化_第10张图片
平行坐标可视化_第11张图片
平行坐标可视化_第12张图片
平行坐标可视化_第13张图片
平行坐标可视化_第14张图片
平行坐标可视化_第15张图片
平行坐标可视化_第16张图片
平行坐标可视化_第17张图片
平行坐标可视化_第18张图片
平行坐标可视化_第19张图片
平行坐标可视化_第20张图片
平行坐标可视化_第21张图片
平行坐标可视化_第22张图片
平行坐标可视化_第23张图片
平行坐标可视化_第24张图片
平行坐标可视化_第25张图片
平行坐标可视化_第26张图片
平行坐标可视化_第27张图片
平行坐标可视化_第28张图片
平行坐标可视化_第29张图片
平行坐标可视化_第30张图片
平行坐标可视化_第31张图片
平行坐标可视化_第32张图片
平行坐标可视化_第33张图片
平行坐标可视化_第34张图片
平行坐标可视化_第35张图片
平行坐标可视化_第36张图片
平行坐标可视化_第37张图片
平行坐标可视化_第38张图片
平行坐标可视化_第39张图片
平行坐标可视化_第40张图片
平行坐标可视化_第41张图片
平行坐标可视化_第42张图片
平行坐标可视化_第43张图片
平行坐标可视化_第44张图片
平行坐标可视化_第45张图片

  可视化结果把所有$n\times m$个数据都表示在一张图中,比较全面,但对横坐标的特征顺序敏感,不相邻特征之间的模式人眼不容易观察。如果要观察某两个特征之间的关系,可以使它们的位置相邻。

你可能感兴趣的:(python,机器学习,matplotlib,开发语言,人工智能)