1. 程式人生 > >使用PCA對資料集進行降維

使用PCA對資料集進行降維

使用PCA對資料集進行降維

一、實驗準備

1、實驗內容和目的

  • 使用主成分分析(PCA)對鳶尾花資料集進行降維操作,其中要求繪製出降維後的資料分佈散點圖並說明降維後的維度,提取的主成分的特徵值

  • 其中資料集檔案為iris.data.txt。資料集中的每個樣本有4個特徵引數,最後的標籤為鳶尾花的類別

2、實驗原理

  • 前面學習到了KNN分類演算法,然後使用KNN演算法進行鳶尾花的分類。分類時,雖然將資料集中的所有特徵都納入了考慮範圍,都參與了計算,但由於只有4個特徵,並不會明顯地加大計算的複雜程度。但如果處理別的資料集時,假如此時的樣本擁有成百上千個特徵,還會一樣的輕鬆嗎?

  • 想象這樣一種場景:我們正通過電視而非現場觀看體育比賽,在電視上的純平顯示器上有一個球。顯示器大概包含了100萬畫素,而球則可能是由較少的畫素組成的,比如說一千個畫素。在大部分體育比賽中,我們關注的是給定時刻球的位置。人的大腦要想了解比賽的進展,就需要了解球在運動場中的位置。對於人來說,這一切顯得十分自然,甚至都不需要做任何思考。在這個場景當中,人們實時地將顯示器上的百萬畫素轉換成為了一個三維影象,該影象就給出了運動場上球的位置。在這個過程中,人們已經將資料從一百萬維降至了三維

  • 在上述體育比賽的例子中,人們面對的原本是百萬畫素的資料,但是隻有球的三維位置才最重要,這就稱作降維。在低維下,資料更容易進行處理。另外,其相關特徵可能在資料中明確地顯示出來

  • 降維就是對高維度特徵的一種預處理方法,它將高維度的資料保留下最重要的一些特徵,去除噪聲和不重要的特徵,從而實現提升資料處理速度的目的。在實際的生產和應用當中,降維在一定的資訊損失範圍內,可以為我們節省大量的時間和成本。降維也成為了應用非常廣泛的資料預處理方法

  • 主成分分析(PCA)就是一種降維技術,它通過正交變換把可能線性相關的變數轉換為幾乎線性無關的變數,這些變數就是所謂的“主成分”

2.1 PCA的工作原理
  • 在PCA中,資料從原來的座標系轉換到新的座標系,由資料本身決定。轉換座標系時,以方差最大的方向作為座標軸方向,因為資料的最大方差給出了資料的最重要資訊。第一個新座標軸選擇的是原始資料中方差最大的方向,第二個新座標軸選擇的是與第一個新座標軸正交且方差次大的方向。重複該過程,重複次數為原始資料的特徵維數

  • 通過這種方式獲得的新的座標系,大部分方差都包含在前面幾個座標軸中,後面的座標軸所含的方差幾乎為0。於是,我們可以忽略餘下的座標軸,只保留前面的幾個含有絕大部份方差座標軸。事實上,這樣也就相當於只保留包含絕大部分方差的維度特徵,而忽略包含方差幾乎為0的特徵維度,也就實現了對資料特徵的降維處理

2.2 計算協方差矩陣
  • PCA的原理已經知道了,那麼我們如何得到這些包含最大差異性的主成分方向呢?事實上,通過計算資料矩陣的協方差矩陣,然後得到協方差矩陣的特徵值及特徵向量,選擇特徵值最大(也即包含方差最大)的N個特徵所對應的特徵向量組成的矩陣,我們就可以將資料矩陣轉換到新的空間當中,實現資料特徵的降維

  • 這裡說一下方差和協方差之間的關係,首先看一下均值、方差和協方差的計算公式:

X = 1 N i = 1 N X i \overline{X}=\frac{1}{N}\sum_{i=1}^NX_i

S = 1 N 1 i = 1 N ( X i X ) 2 S=\frac{1}{N-1}\sum_{i=1}^N(X_i-\overline{X})^2

C = 1 N 1 i = 1 N ( X i X ) ( Y i Y ) C=\frac{1}{N-1}\sum_{i=1}^N(X_i-\overline{X})(Y_i-\overline{Y})

  • 由上面的公式,我們可以得到以下兩點:

    • 方差的計算針對一維特徵,即針對同一特徵不同樣本的曲直來進行計算得到;而協方差則必須要求至少滿足二維特徵

    • 方差和協方差的除數是 N-1,這樣是為了得到方差和協方差的無偏估計

二、進行實驗

1、演算法思路

  • 在第一部分中已經詳細地說明了PCA的工作原理以及具體的實現方法,即為演算法思路

2、演算法步驟

  • (1) 對資料集進行處理,提出每個樣本的特徵引數集

  • (2) 將特徵引數集組織成 m m n n 列的矩陣 X X

  • (3) 進行零均值化

  • (4) 求出協方差矩陣 C = 1 m 1 X T X C=\frac{1}{m-1}X^TX

  • (5) 求出協方差矩陣的特徵值以及對應的特徵向量

  • (6) 將特徵向量按照對應的特徵值大小進行排序,然後取前k列組成矩陣 P P

  • (7) 矩陣 X X m m n n 列的矩陣,矩陣 P P n n k k 列的矩陣

  • (8) Y = X P Y=X*P 即為降維到 k k 維後的資料矩陣

3、程式碼實現

  • 注:由於這次實驗對應的OJ題目要求提交程式碼進行評測,而OJ題目有一些具體的輸入輸出要求,所以我實現的程式碼就不基於使用本地的資料檔案,最後實現的效果和繪製的散點圖均具體進行描述

  • 具體的功能實現在程式碼中的註釋均進行了詳細說明

#!/usr/bin/python
# -*- coding utf-8 -*-
# Project: PCA
# Author: jiangnan 
# Mail: [email protected]
# Date: 2018/10/27

import numpy as np

def loadDataSet():
    """
    函式說明:
        處理資料集的輸入,將其進行處理後以矩陣的形式返回
    :return:
        np.mat(stringArr) - 矩陣形式的資料集
    """
    stringArr = []
    for i in range(m):
        line = input().split(',')   #輸入的資料以逗號分隔,以此進行分詞
        tempArr = []
        for j in line:
            tempArr.append(float(j))    #轉換為float型別
        stringArr.append(tempArr)
    return np.mat(stringArr)    #返回資料矩陣

def pca():
    """
    函式說明:
        對資料集進行PCA操作
    """
    meanVals = np.mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals    #零均值化

    covMat = np.cov(meanRemoved, rowvar=0)  #求協方差矩陣

    eigVals, eigVects = np.linalg.eig(np.mat(covMat))   #求特徵值和特徵向量

    eigValInd = np.argsort(eigVals)  #對特徵值的下標進行排序操作


    eigValInd_re = eigValInd[: -(k + 1): -1]    #取出最大的k個特徵值

    for i in eigValInd_re:       #根據OJ的要求,輸出特徵值
        print(eigVals[i], end=' ')
    print()

    eigValInd = reversed(eigValInd)

    for i in eigValInd:         #根據OJ的要求,輸出特徵向量
        for j in range(k):
            print(eigVects[i, j], end=' ')
        print()


    redEigVects = eigVects[: ,eigValInd_re]

    lowDDataMat = meanRemoved * redEigVects     #計算獲得降維到k維後的資料矩陣

    for i in range(m):          #根據OJ的要求,輸出降維後的資料矩陣
        for j in range(k):
            print(lowDDataMat[i, j], end=' ')
        print()


m, n, k = map(int, input().split()) #m和n標示輸入資料的行和列,k標示降至k維

dataMat = loadDataSet()

pca()

3、實現效果

3.1 OJ測評結果

在這裡插入圖片描述

3.2 繪製散點圖
  • (1) 繪製一維圖

在這裡插入圖片描述

  • (2) 繪製二維圖

在這裡插入圖片描述

  • (3) 使用PCA降至3維

在這裡插入圖片描述

4、總結

  • 大致總結了PCA(主成分分析)的優缺點:

    • 優點:降低資料的複雜性,識別最重要的多個特徵

    • 缺點:可能損失有用資訊