手把手的機器學習新手教學與R語言實作:主成份分析— PCA ...

文章推薦指數: 80 %
投票人數:10人

基本介紹. “手把手的機器學習新手教學與R語言實作:主成份分析— PCA (Principle component analysis)” is published by Shan-Jyun Wu. GetstartedOpeninappShan-JyunWuSigninGetstarted12FollowersAboutGetstartedOpeninapp手把手的機器學習新手教學與R語言實作:主成份分析—PCA(Principlecomponentanalysis)Shan-JyunWuAug18,2018·3minread基本介紹在資料科學實務中,經常會處理到高維度的資料。

以Kaggle的Zillow資料集為例,每一筆資料有著不同欄位,也就是特徵(features),諸如房子的類別、房子的大小、周圍的房價、衛浴房間的數量…等等。

高維度資料通常有不易分析、不易理解、無法視覺化呈現的缺點。

從實際層面看,過高的維度也會增加儲存資料所需的資源。

不過,在高維度下,有些維度是多餘的,可以在不丟失過多資訊下,被其他維度的線性組合所表述。

於是,就有了所謂的降維(dimensionalityreduction)技術。

舉例來說,本來有1、2百個欄位的資料,經過一番處理,欄位頓時少了一半,而且即使欄位變少,這份資料帶給你的資訊量卻沒變少(起碼資訊量的減少沒有明顯到讓你可以察覺),OMG,這真是太神奇了,人生還有什麼比這更美好的事?回到正題。

PCA是一種常見的降維方法,考慮N筆具有p個特徵,X1,X2,…,Xp,的資料,令X=[X1,X2,…,Xp]為Nxp維矩陣,也就是說,每一筆資料都可視為R^p空間中的一個向量。

PCA的基本精神,即是利用正交投影(orthogonalprojection),將高維度資料投影到低維度空間,並找到保留最大資料變異數(variation)的低維度表徵方式,使每筆資料的低維度表徵是該p個特徵的線性組合。

利用PCA,我們可以找到某個位於R^p空間中的標準化(normalized)向量:,使資料投影在此向量上的變異數最大,而該投影Z1稱為第一主成份(firstprinciplecomponent):firstprinciplecomponent其中,稱為fisrtprinciplecomponentscores,即為N筆資料在向量上的投影量,而此向量稱為第一主成分的負荷向量(loadingvectorofthefirstprinciplecomponent)。

依此類推,PCA可以進一步沿著與向量正交的方向,找到一個標準化的向量,使資料投影在此向量上的變異數最大,接著找到向量既然已經用PCA找出各個主成分:,而主成分的幾何意義又代表p維空間中向量,於負荷向量(loadingvectors)張出的子空間中的投影,那麼,只要適當選取主成份的數量,比如:(以上都是Nx2維矩陣)就可以用低維空間的向量來表徵原本的N筆資料了。

PCA演算法(施工中施工中施工中施工中施工中)R語言實例讓我們用R語言內建的USArrests資料集,實作一下PCA。

USArrests是根據1973年,美國50州各州,平均每100,000個居民裡,因為犯下Murder(謀殺)、Assault(襲擊他人)、與Rape(強暴)而遭逮補的人數,UrbanPop代表各州居住在都會區的人口百分比。

>library(tidyverse)─Attachingpackages─────────────────────tidyverse1.2.1─✔ggplot23.0.0✔purrr0.2.5✔tibble1.4.2✔dplyr0.7.6✔tidyr0.8.1✔stringr1.2.0✔readr1.1.1✔forcats0.3.0─Conflicts──────────────────────tidyverse_conflicts()─✖dplyr::filter()masksstats::filter()✖dplyr::lag()masksstats::lag()>data("USArrests")>head(USArrests)MurderAssaultUrbanPopRapeAlabama13.22365821.2Alaska10.02634844.5Arizona8.12948031.0Arkansas8.81905019.5California9.02769140.6Colorado7.92047838.7首先,直接用R語言內建的prcomp函數,來看看PCA的應用。

>pcaattributes(pca)$names[1]"sdev""rotation""center""scale""x"$class[1]"prcomp">mode(pca)[1]"list"其中,rotation這個屬性儲存了由負荷向量(loadingvector)形成的矩陣:>pca$rotationPC1PC2PC3PC4Murder-0.53589950.4181809-0.34123270.64922780Assault-0.58318360.1879856-0.2681484-0.74340748UrbanPop-0.2781909-0.8728062-0.37801580.13387773Rape-0.5434321-0.16731860.81777790.08902432一般來說,對N筆p維的資料,principlecomponents的數量為min(N-1,p),在這裡,我們可以看到USArrests資料集的principlecomponents一共有四個。

x屬性則存取principalcomponentsscores:>head(pca$x)PC1PC2PC3PC4Alabama-0.97566041.1220012-0.439803660.154696581Alaska-1.93053791.06242692.01950027-0.434175454Arizona-1.7454429-0.73845950.05423025-0.826264240Arkansas0.13999891.10854230.11342217-0.180973554California-2.4986128-1.52742670.59254100-0.338559240Colorado-1.4993407-0.97762971.084001620.001450164我們可以選取PC1和PC2來作為降維視覺化兩個principlecomponents。

利用biplot函數,可以幫助我們很快完成這件事。

biplot預設會選取PC1,PC2來做圖,也可以自訂想選取的components,比如想選取PC1和PC3,則可以在biplot裡加入choices=1:3。

biplot(pca,scale=0)#scale=0代表將loadingvector做適當scale紅色箭頭代表loadingvectors在PC1PC2兩個方向上的分量。

文字則代表PC1與PC2方向上的scores。

現在,我們稍微把水探得深一點,來看看如何用R語言實作PCA演算法。

首先必須把每一個特徵的平均值歸零、標準差歸ㄧ。

先來看一下原本數據的平均值標準差為何。

>apply(USArrests,2,var)MurderAssaultUrbanPopRape18.970476945.16571209.5187887.72916>apply(USArrests,2,mean)MurderAssaultUrbanPopRape7.788170.76065.54021.232接著,把數據集rescale一下:>scaledUSArrestsapply(USArrests,2,var)#檢查一下標準差MurderAssaultUrbanPopRape18.970476945.16571209.5187887.72916>scaledUSArrestsapply(scaledUSArrests,2,var)#檢查一下標準差MurderAssaultUrbanPopRape1111>apply(scaledUSArrests,2,mean)#檢查一下平均值MurderAssaultUrbanPopRape-7.663087e-171.112408e-16-4.332808e-168.942391e-17(施工中施工中施工中)參考資料:MathematicsforMachineLearning:PCAAnIntroductiontoStatisticalLearningwithApplicationsinRShan-JyunWuFollow3838 38MachineLearningDimensionalityReductionDataScienceStatisticalLearningRMorefromShan-JyunWuFollow



請為這篇文章評分?