在現實生活中,一筆資料可能會有許多欄位,如交易資料會有交易日期,時間,數量等欄位,而天氣資料會有氣溫,氣壓,濕度等,視資料屬性而定還會有超高維度資料存在(如100x100大小的灰階圖片資料可以看成是10,000維的資料,若為RGB彩色圖片就是高達30,000維的高維資料)在處理這些高維資料時會需要耗費許多時間與空間進行處理資料,且時常會包含較不重要的維度資料在其中,並增加資料複雜度。因此在進行高維資料處理時,常使用被稱為**資料降維(Dimension Reduction)**的技術,將高維資料轉換為低維資料,以利後續的資料處理。

Introduction

為了處理因資料維度過高而產生的問題(Curse of dimension)所產生的降維技術,可大致上分為 Feature SelectionFeature Extraction兩種類型的方法。

  • Feature Selection(特徵選擇):直接從原始資料集中挑選適合的特徵維度進行分析,即直接捨棄部分原始資料維度。

  • Feature Extraction(特徵擷取):透過演算法將原始資料轉換為新資料,即將所有資料維度當成輸入,並透過演算法產生降維過的資料集。

兩個方法各有不同的應用領域,而往後的主題將主要集中在討論Feature Extraction的部分。

Concept

假設資料

$$X$$

包含

$$n$$

維資料,即

$$X=\{x_1, x_2, \ldots, x_n\}$$

,我們希望將

$$X$$

降維成

$$k$$

維的資料

$$Z$$

,即

$$Z=\{z_1, z_2, \ldots, z_k\}$$

$$k \leq n$$

,如

$$Z$$

能保留高維資料

$$X$$

的某些關係性,我們即可稱

$$Z$$

$$X$$

的降維資料。

overview

降維後的

$$Z$$

資料因資料維度低,且經過演算法分析去除影響力低,凸顯出更為本質的部分,對往後資料計算的負荷量,保存的空間大小,資料視覺化等都有相當程度的助益。

Example

在之後的範例將使用Iris flower data set (鳶尾花卉數據集),並用PCA演算法進行一個簡單的降維資料示範。由於使用的程式語言工具是Python以及相關套件做示範,未安裝人員可先參考以下網站簡介了解並安裝相關套件。

  • Python:一套直譯式程式語言,有許多統計或機器學習的套件可使用。
  • Sciki-learn:Python的一套機器學習套件,提供了許多函式庫可供使用。
  • Matplotlib:Python上的繪圖函式庫。

Iris flower data set

Iris data set 是英國統計學家 Ronald Fisher 爵士在1936年時,對加斯帕半島上的鳶尾屬花朵所提取的Petal(花瓣)與Sepal(花萼)的長寬數據,類別分別為setosa(山鳶尾),versicolor(變色鳶尾)與virginica(維吉尼亞鳶尾)等三類共150筆的資料。資料內容如下表所示

Sepal Length Sepal Width Petal Length Petal Width Label
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
7.0 3.2 4.7 1.4 versicolor
6.4 3.2 4.5 1.5 versicolor
6.3 3.3 6.0 2.5 virginica
5.8 2.7 5.1 1.9 virginica

時至今日,該資料集以成為經典的數據資料並常作為為範例來使用。由於該資料集已包含在Sciki-learn的套件中,可直接由套件中讀取使用,也可自行下載原始資料集

因 Iris dataset 為四維資料,無法直接進行資料視覺化,以下使用 PCA 將該資料降低至二維,並以 Matplotlib 繪製二維資料展示降維結果。

Code

執行下列Python Code進行PCA降維

# 匯入相關 Package
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA

# 取得 Iris data set
iris = datasets.load_iris()
iris_label = iris.target

# 設定 PCA Model參數並對 data set進行降維
pca_model = PCA(n_components=3)
pca_result = pca_model.fit_transform(iris.data)

# 繪製資料2D表示圖,並將不同類別加上顏色標示
for idx, label in enumerate(iris_label):
    if label == 0:
        color = 'ro'
    elif label == 1:
        color = 'go'
    elif label == 2:
        color = 'bo'
    else:
        continue
    x = pca_result[idx, 0]
    y = pca_result[idx, 1]
    plt.plot(x, y, color)

Result

下圖為將 Iris dataset 以 PCA 降到二維資料後,將不同種類花朵以不同顏色顯示出來的結果。

PCA-2D

其中紅色代表 setosa,綠色代表 versicolor,藍色為 virginica。 可以看出使用PCA轉換將原始資料從4維降低到2維後,不同種類的花朵仍有不同的分布區域。代表即使資料維度降低了但資料間關係性仍然存在,達到了資料降維的目的。

而除了 PCA 外,也有其他如 MDSIsomapLDALLE等,以及透過 Neural Network的Autoencode等相關技術。由於不同資料有著不同的特性,可使用多種方式互相比較,找出最適合該資料集的演算法。

Reference