平行座標可視化

  參考自《數據挖掘概念與技術》。

  對於有$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個特徵的可視化結果:

  可視化結果把所有$n\times m$個數據都表示在一張圖中,比較全面,但對橫座標的特徵順序敏感,不相鄰特徵之間的模式人眼不容易觀察。如果要觀察某兩個特徵之間的關係,可以使它們的位置相鄰。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章