30分鐘學會PCA主成分分析

2021-02-19 算法美食屋

PCA主成分分析算法(Principal Components Analysis)是一種最常用的降維算法。能夠以較低的信息損失(以樣本間分布方差衡量)減少特徵數量。

PCA算法可以幫助分析樣本中分布差異最大的成分(主成分),有助於數據可視化(降低到2維或3維後可以用散點圖可視化),有時候還可以起到降低樣本中的噪聲的作用(丟失的信息有部分是噪聲)。

公眾號後臺回復關鍵詞:源碼。獲取本文全部代碼和對應插圖。

一,PCA算法的直覺理解

從直覺上看,PCA主成分分析類似於依次尋找一群樣本點的各個位置差異最大的方向長軸。

假定把一個人身上的所有細胞看成一個一個的樣本點。這些樣本點可以用3個坐標來表示,從左到右為x方向,從前到後為y方向,從下到上為z方向。

那麼它們的第一個主成分是什麼呢?第一個主成分對應的長軸是沿著人的腳到頭的方向,也就是通常的上下方向,即z方向。這個方向是最主要的長軸。這些樣本點的位置差異基本上70%以上來自於這個方向上的差異。

它們的第二個主成分是什麼呢?第二個主成分對應的方向是沿著人的左臂到右臂的方向,也就通常的左右方向,即y方向。這個方向和第一個主成分長軸垂直,這些樣本點的位置差異大概有20%左右來自這個方向上的差異。

它們的第三個主成分是什麼呢?第三個主成分方向是沿著人的前胸到後背的方向,也就是通常的前後方向,即x方向。這個方向和前兩個主成分長軸垂直,樣本點的位置差異有一般只有不到10%來自這個方向的差異,當然,有些身材比較圓潤的同學除外。

現在,如果要將這些樣本點的坐標減少到用2個來表示,並儘可能多的保留樣本點之間位置差異的信息,那麼,顯然,應該保留第一個主成分坐標和第二個主成分坐標。

現在,假定這個人躺在一個斜的躺椅上,那麼現在這些樣本點的第一主成分顯然不再是從下到上的z方向。我們應該將我們的坐標系作一個旋轉,讓z軸和斜著的躺椅方向一致,這個新的z方向是這些樣本點的第一主成分方向。類似地,也需要旋轉x軸和y軸得到新的第二主成分方向和第三主成分方向。

這個旋轉舊坐標系以找到主成分方向的過程就是PCA主成分分析。

二,PCA算法的數學說明

PCA主成分分析(Principal Components Analysis)是一種通過正交線性組合方式最大化保留樣本間方差的降維方法。

用幾何觀點來看,PCA主成分分析方法可以看成通過正交變換,對坐標系進行旋轉和平移,並保留樣本點投影坐標方差最大的前幾個新的坐標。

這裡有幾個關鍵詞需要說明:

降維:將樣本原來的m維特徵用更少的k個特徵取代。降維算法可以理解成一種數據壓縮方法,它可能會丟失一些信息。

正交線性組合:k個新特徵是通過對m個舊特徵進行線性組合產生的,並且k個線性組合的係數向量為單位向量,且彼此相互正交。

最大化保留樣本間方差:第1個主成分特徵最大化樣本間特徵方差,第2個主成分特徵在滿足與第1個主成分正交約束條件下最大化樣本間特徵方差,……

三,PCA算法的調包範例

下面的範例我們調用sklearn中的PCA降維算法接口,對波士頓房價數據集進行降維(13維降到7維)。

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
from sklearn import datasets

boston = datasets.load_boston()
dfdata = pd.DataFrame(boston.data,columns = boston.feature_names)
dfdata.head()

# 不同特徵取值範圍相差較大,我們首先進行標準正態歸一化
# 歸一化的結果作為 PCA降維的輸入
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(dfdata.values)
X_input = scaler.transform(dfdata.values)

# 我們的輸入有506個樣本,13維特徵
print(X_input.shape)

輸出如下:

(506, 13)

# 應用PCA進行降維

from sklearn.decomposition import PCA
pca = PCA(n_components=7)
pca.fit(X_input)
X_output = pca.transform(X_input)

# 降維後,只有7維特徵
print(X_output.shape)

輸出如下:

(506, 7)

# 查看各個主成分對應的方差大小和佔全部方差的比例
# 可以看到前7個主成分已經解釋了樣本分布的90%的差異了。

print("explained_variance:")
print(pca.explained_variance_)

print("explained_variance_ratio:")
print(pca.explained_variance_ratio_)

print("total explained variance ratio of first 7 principal components:")
print(sum(pca.explained_variance_ratio_))

輸出如下:

#可視化各個主成分貢獻的方差
%matplotlib inline
%config InlineBackend.figure_format = 'svg'

import matplotlib.pyplot as plt
plt.figure()
plt.plot(np.arange(1,8),pca.explained_variance_,linewidth=2)
plt.xlabel('components_n', fontsize=16)
plt.ylabel('explained_variance_', fontsize=16)
plt.show()

# 查看降維對應的正交變換矩陣,即各個投影向量
W = pca.components_
# 驗證正交關係
np.round(np.dot(W,np.transpose(W)),6)

# 對降維後的數據的前兩維進行散點圖可視化

%matplotlib inline
%config InlineBackend.figure_format = 'svg'

plt.scatter(X_output[:,0],X_output[:,1])
plt.xlabel("components_1")
plt.ylabel("components_2")
plt.show()

四,PCA算法的數學推導

前方高數提醒。

下面進行PCA算法的數學原理推演,證明第k個主成分投影向量恰好是樣本的協方差矩陣的第k大特徵值對應的特徵向量。

下面的推演會用到高等數學中的一些線性代數知識和微積分知識。

沒有相關數學基礎的同學可以跳過,在實踐中只要掌握PCA算法的直覺概念和調包使用方法,基本就夠用了。

公眾號後臺回復關鍵詞:源碼。獲取本文全部代碼和對應插圖。

相關焦點

  • R語言 PCA主成分分析
    問題或建議,請公眾號留言;R語言 PCA主成分分析前言統計學背景知識協方差相關係數函數總結實例講解1.載入原始數據2.作主成分分析3.結果解讀4.畫主成分的碎石圖並預測5.PCA結果繪製後記前言PCA分析大家肯定經常看到,但是你真的懂PCA分析的結果嗎?圖我也會看,我只是不是很清楚PCA背後輸出結果的解讀而已。
  • 主成分分析(PCA)實用指南(R&Python)
    今天我們聊聊基礎知識,主要介紹一種化繁為簡的神奇方法——主成分分析。注意,理解本文需要具備一定統計學基礎。有時候,如果數據集裡有太多變量,你會怎麼辦?以下是每一位分析師都可能遇到的幾種情況:試想一下,當自己身處這四種境地,你會怎麼做?不要逃,處理這些情況並沒有想像中的那麼困難,一些統計方法,如因子分析、主成分分析就有助於克服它們。
  • 淺談主成分分析PCA
    主成分分析(Principal component analysis, PCA)是一種很常見的數據分析方法,主要用於高維數據的降維處理和高維數據的可視化。如下圖所示,實驗記錄人的動作信息,然後PCA分析便可以捕捉人運動過程中的motion中的代表性動作[1]。
  • PCA主成分分析實戰和可視化 | 附R代碼和測試數據
    一文看懂PCA主成分分析中介紹了PCA分析的原理和分析的意義(基本簡介如下,更多見博客),今天就用數據來實際操練一下。
  • 100天搞定機器學習|Day59 主成分分析(PCA)原理及使用詳解
    PCA原理主成分分析法(Principal Component Analysis)是一種基於變量協方差矩陣對數據進行壓縮降維、去噪的有效方法,它藉助正交變換將一組可能存在相關性的變量轉換為一組線性不相關的變量,轉換後的這組變量叫主成分(PC),主成分是舊特徵的線性組合。
  • 用StackOverflow訪問數據實現主成分分析(PCA)
    大數據文摘出品編譯:汪小七、張馨月、雲舟主成分分析(PCA:Principal Component Analysis)非常有助於我們理解高維數據,我利用Stack Overflow的每日訪問數據對主成分分析進行了實踐和探索,你可以在rstudio :: conf 2018上找到其中一篇演講的錄音
  • R數據分析:主成分分析及可視化
    主成分分析是一個常見的降維,探索性技術,常常在量表編制或者其它變量較多數據集分析的時候會用到,今天給大家寫寫R語言中如何快速高效的進行PCA和可視化。<- prcomp(mtcars, center = TRUE,scale. = TRUE)summary(mtcars.pca)上面的代碼就實現了整個數據的主成分分析,並且輸出了我們的每個主成分解釋的方法比。
  • 一文讀懂stata做主成分分析
    由計量經濟學服務中心綜合整理,轉載請聯繫一.主成分分析主成分分析方法是降維分析方法
  • R語言之主成分分析
    主成分分析(Principal Component Analysis,PCA),就是將多個變量通過 線性變換以選出較少個數重要變量的一種多元統計分析方法
  • 主成分分析(PCA)
    本文上半部分轉載自:http://blog.codinglabs.org/articles/pca-tutorial.html這位大佬已經寫的非常簡潔明了
  • 機器學習之數據降維總結+代碼示例復現(線性代數/矩陣論/主成分分析PCA/核主成分分析KPCA/奇異值分解SVD)
    PCA(Principal Component Analysis)主成分分析    關於主成分分析PCA的原理以及數學解釋,請參照本文章開始部分手寫筆記整理。PCA識別最靠近數據的超平面,並將樣本數據集投影到該超平面上。
  • 主成分分析PCA一站式指南
    編者按:General Assembly數據科學主講Matt Brems講解了主成分分析的原理、數學和最佳實踐。
  • 聚類分析和主成分分析
    下面這張圖就形象地展現了如何利用主成分分析將二維降至一維。試對該數據進行主成分分析。根據碎石圖轉折點在2個主成分或3個主成分主成分分析結果:> summary(pr,loadings=TRUE)Importance of
  • PCA-主成分分析
    PCA-主成分分析PCA是什麼PCA(Principal Component Analysis,主成分分析)是一種常用的數據分析方法。PCA被稱為應用線性代數的最有價值的成果之一,在從神經科學到計算機圖形學的各種分析中都得到了廣泛使用。
  • 一文看懂PCA主成分分析
    主成分分析簡介主成分分析 (PCA, principal component analysis)是一種數學降維方法, 利用正交變換 (orthogonal
  • 【R與數據分析】多元統計分析之主成分分析及R實現過程
    主成分分析方法通過降維技術把多個變量化為少數幾個主成分的方法,並且這些主成分保留原始變量的絕大部分信息,通常表現為原始變量的線性組合。通過主成分分析我們能夠有效利用大量數據進行定量分析,並揭示變量之間的內在關係。(1)       我們知道主成分分析是將原來的變量指標進行重新組合的新的綜合指標,我們的目的就是要來選擇儘可能少的主成分。
  • 群體遺傳中的主成分分析及其解讀
    主成分分析是群體遺傳學中常用的分析手段,一般用來 1)分析群體中存在的群體結構(分層); 2) 推斷群體歷史; 3) 關聯分析中對群體結構進行校正
  • 一文讀懂PCA分析 (原理、算法、解釋和可視化)
    這種投射方式會有很多,為了最大限度保留對原始數據的解釋,一般會用最大方差理論或最小損失理論,使得第一主成分有著最大的方差或變異數(就是說其能儘量多的解釋原始數據的差異);隨後的每一個主成分都與前面的主成分正交,且有著僅次於前一主成分的最大方差(正交簡單的理解就是兩個主成分空間夾角為90°,兩者之間無線性關聯,從而完成去冗餘操作)。主成分分析的意義簡化運算。
  • 一步步教你輕鬆學主成分分析PCA降維算法
    主成分分析(英語:Principal components analysis,PCA)是一種分析、簡化數據集的技術。主成分分析經常用於減少數據集的維數,同時保持數據集中的對方差貢獻最大的特徵。這是通過保留低階主成分,忽略高階主成分做到的。這樣低階成分往往能夠保留住數據的最重要方面。但是,這也不是一定的,要視具體應用而定。由於主成分分析依賴所給數據,所以數據的準確性對分析結果影響很大。
  • 【直播】我的基因組55:簡單的PCA分析千人基因組的人群分布
    今天,我們主要講的是人群分布,先用簡單的PCA來分析一下千人基因組的人群分布吧!PCA分析,就是主成分分析,我博客有講過(點擊最底部的閱讀原文或複製連結http://www.bio-info-trainee.com/1232.html進行查看)。 PCA的原本目的是因為變量太多,想把它們合併成兩三個變量,從而簡化分析步驟。