使用PCA對資料集進行降維
使用PCA對資料集進行降維
一、實驗準備
1、實驗內容和目的
-
使用主成分分析(PCA)對鳶尾花資料集進行降維操作,其中要求繪製出降維後的資料分佈散點圖並說明降維後的維度,提取的主成分的特徵值
-
其中資料集檔案為iris.data.txt。資料集中的每個樣本有4個特徵引數,最後的標籤為鳶尾花的類別
2、實驗原理
-
前面學習到了KNN分類演算法,然後使用KNN演算法進行鳶尾花的分類。分類時,雖然將資料集中的所有特徵都納入了考慮範圍,都參與了計算,但由於只有4個特徵,並不會明顯地加大計算的複雜程度。但如果處理別的資料集時,假如此時的樣本擁有成百上千個特徵,還會一樣的輕鬆嗎?
-
想象這樣一種場景:我們正通過電視而非現場觀看體育比賽,在電視上的純平顯示器上有一個球。顯示器大概包含了100萬畫素,而球則可能是由較少的畫素組成的,比如說一千個畫素。在大部分體育比賽中,我們關注的是給定時刻球的位置。人的大腦要想了解比賽的進展,就需要了解球在運動場中的位置。對於人來說,這一切顯得十分自然,甚至都不需要做任何思考。在這個場景當中,人們實時地將顯示器上的百萬畫素轉換成為了一個三維影象,該影象就給出了運動場上球的位置。在這個過程中,人們已經將資料從一百萬維降至了三維
-
在上述體育比賽的例子中,人們面對的原本是百萬畫素的資料,但是隻有球的三維位置才最重要,這就稱作降維。在低維下,資料更容易進行處理。另外,其相關特徵可能在資料中明確地顯示出來
-
降維就是對高維度特徵的一種預處理方法,它將高維度的資料保留下最重要的一些特徵,去除噪聲和不重要的特徵,從而實現提升資料處理速度的目的。在實際的生產和應用當中,降維在一定的資訊損失範圍內,可以為我們節省大量的時間和成本。降維也成為了應用非常廣泛的資料預處理方法
-
主成分分析(PCA)就是一種降維技術,它通過正交變換把可能線性相關的變數轉換為幾乎線性無關的變數,這些變數就是所謂的“主成分”
2.1 PCA的工作原理
-
在PCA中,資料從原來的座標系轉換到新的座標系,由資料本身決定。轉換座標系時,以方差最大的方向作為座標軸方向,因為資料的最大方差給出了資料的最重要資訊。第一個新座標軸選擇的是原始資料中方差最大的方向,第二個新座標軸選擇的是與第一個新座標軸正交且方差次大的方向。重複該過程,重複次數為原始資料的特徵維數
-
通過這種方式獲得的新的座標系,大部分方差都包含在前面幾個座標軸中,後面的座標軸所含的方差幾乎為0。於是,我們可以忽略餘下的座標軸,只保留前面的幾個含有絕大部份方差座標軸。事實上,這樣也就相當於只保留包含絕大部分方差的維度特徵,而忽略包含方差幾乎為0的特徵維度,也就實現了對資料特徵的降維處理
2.2 計算協方差矩陣
-
PCA的原理已經知道了,那麼我們如何得到這些包含最大差異性的主成分方向呢?事實上,通過計算資料矩陣的協方差矩陣,然後得到協方差矩陣的特徵值及特徵向量,選擇特徵值最大(也即包含方差最大)的N個特徵所對應的特徵向量組成的矩陣,我們就可以將資料矩陣轉換到新的空間當中,實現資料特徵的降維
-
這裡說一下方差和協方差之間的關係,首先看一下均值、方差和協方差的計算公式:
-
由上面的公式,我們可以得到以下兩點:
-
方差的計算針對一維特徵,即針對同一特徵不同樣本的曲直來進行計算得到;而協方差則必須要求至少滿足二維特徵
-
方差和協方差的除數是 N-1,這樣是為了得到方差和協方差的無偏估計
-
二、進行實驗
1、演算法思路
- 在第一部分中已經詳細地說明了PCA的工作原理以及具體的實現方法,即為演算法思路
2、演算法步驟
-
(1) 對資料集進行處理,提出每個樣本的特徵引數集
-
(2) 將特徵引數集組織成 行 列的矩陣
-
(3) 進行零均值化
-
(4) 求出協方差矩陣
-
(5) 求出協方差矩陣的特徵值以及對應的特徵向量
-
(6) 將特徵向量按照對應的特徵值大小進行排序,然後取前k列組成矩陣
-
(7) 矩陣 是 行 列的矩陣,矩陣 是 行 列的矩陣
-
(8) 即為降維到 維後的資料矩陣
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(主成分分析)的優缺點:
-
優點:降低資料的複雜性,識別最重要的多個特徵
-
缺點:可能損失有用資訊
-