principal components analysis(PCA)

PCA,即主成分分析,是一個很常見的降維方法(屬于無監(jiān)督學(xué)習(xí)),過去看到它總是對它避而遠(yuǎn)之,今天下定決心把它搞懂。

首先來看該篇博文對為什么要有降維原理技術(shù)的緣由和背景進(jìn)行解釋(這是一篇出色的博文)

在介紹PCA之前,先明確幾點(diǎn)

首先,數(shù)據(jù)其實(shí)就是特征表示。在坐標(biāo)軸上,一個點(diǎn)(即一個數(shù)據(jù))由其不同坐標(biāo)軸(或維度)的特征值決定。簡單來說,一個data就是一個vector。

   | X | Y |...| Z |  <--- 特征(維度)
    --- --- --- ---
d1 |   |   |...|   |
d2 |   |   |...|   |
...

dn |   |   |...|   |

其中X,Y,....,Z為特征,而d1,d2,...,dn為數(shù)據(jù)。可以看書數(shù)據(jù)其實(shí)是由對應(yīng)的特征值組成的。


再如上述圖,可以看出該數(shù)據(jù)有兩個特征cell1和cell2,故用cell1和cell2就可表示該數(shù)據(jù)了。

我們使用PCA的目的是將數(shù)據(jù)從n維特征降到k維特征。數(shù)據(jù)在擁有n維特征時,坐標(biāo)空間擁有n個相互正交的basis,而在降成擁有k維特征時,坐標(biāo)空間擁有k個相互正交的basis。本來由n個數(shù)值(這里已知每個數(shù)值是代表哪個特征,可解釋)來表示成一個數(shù)據(jù),現(xiàn)可由k個數(shù)值來表示一個數(shù)據(jù)。這k個數(shù)值不可解釋,我們只知道它們可以最大程度地表示該數(shù)據(jù)。

下面還是借用該博文來進(jìn)一步闡明PCA的原理


第一點(diǎn)我們已經(jīng)在上面說明過了,從n維到k維度,即從n個正交坐標(biāo)到k個正交坐標(biāo).
第二點(diǎn),為什么要保留方差大的維度(坐標(biāo)軸)呢?來看一個直觀的圖。

因?yàn)閏ell2方向上的方差很小,可以認(rèn)為數(shù)據(jù)信息的冗余度(Redundancy)很大,因?yàn)榉讲钚。頂?shù)據(jù)集中在均值附近,可用均值來代替這些方差值。而cell1方向上方差很大,故可以將這些數(shù)據(jù)映射到cell1軸上,如下圖所示。

第三點(diǎn),提出了協(xié)方差(Covariance)的概念主要是為了reduce redundant information。關(guān)于協(xié)方差,具體可以看這篇博文。


如果兩個隨機(jī)變量協(xié)方差很大,說明他們produce a lot of redundancy,只保留其中一個即可。如果兩個隨機(jī)變量的隨機(jī)變量的協(xié)方差很小,接近于0,那么它們可看做是不相關(guān)的。

接下來我們引入?yún)f(xié)方差矩陣和散度矩陣:
首先看看協(xié)方差的定義

注意,對于概率論來講,X是隨機(jī)變量,協(xié)方差是針對X的樣本(xi)來計(jì)算的。但是實(shí)際應(yīng)用時,X是代表特征的包含數(shù)據(jù)的向量,我們稱之為特征矢量,就如最上面所看的X特征的列向量。

協(xié)方差矩陣


協(xié)方差矩陣一般用大小C來表示


散度矩陣


這里最重要的是注意數(shù)據(jù)集X的表示。它與最開始上面的數(shù)據(jù)表示反過來,即矩陣X的每一列代表一個數(shù)據(jù),而每一行代表一個特征(維度)

  | d1 | d2 |...| dn |
   ---- ---- --- ----
X |    |    |...|    |
Y |    |    |...|    |
...
Z |    |    |...|    |

從這里可以看出散度矩陣等于協(xié)方差矩陣/(n-1),其中n為數(shù)據(jù)集數(shù)。
注意,我們通常使用散度矩陣來得到協(xié)方差矩陣的。

得到數(shù)據(jù)集X的協(xié)方差矩陣后,我們就有了一個明確的目標(biāo),即減小不同特征(維度)之間的冗余度(Redundancy)。換句話說,就是讓covariance(Xi,Xj)(i≠j)接近于0,即使協(xié)方差矩陣除對角線以外的元素都為0。

協(xié)方差對角化有兩個方法:
(1)特征值對角化法
(2)SVD分解法


這里我們有

我們現(xiàn)在來驗(yàn)證一下它的正確性:



在這里符號 ' 表示中心化,接著

矩陣P是矩陣Q的轉(zhuǎn)置后去前k個向量。故有

故最后

即新的數(shù)據(jù)集Y的協(xié)方差是一個k×k的對角陣。


同樣的,



其中:k表示取前k個值,(相應(yīng)的維度也發(fā)生變化)

super note!!
根據(jù)代碼來看,最后的出的新數(shù)據(jù)Y是等于PX',即新數(shù)據(jù)是原始數(shù)據(jù)降維投影到新坐標(biāo)后再中心化或先中心化后再投影的。即

PCA的python實(shí)現(xiàn)代碼

##Python實(shí)現(xiàn)PCA
import numpy as np

def pca(X,k):#k is the components you want

  #mean of each feature
  n_samples, n_features = X.shape

  mean=np.array([np.mean(X[:,i]) for i in range(n_features)])

  #normalization
  norm_X=X-mean

  #scatter matrix
  scatter_matrix=np.dot(np.transpose(norm_X),norm_X)

  #Calculate the eigenvectors and eigenvalues
  eig_val, eig_vec = np.linalg.eig(scatter_matrix)

  eig_pairs = [(np.abs(eig_val[i]), eig_vec[:,i]) for i in range(n_features)]

  # sort eig_vec based on eig_val from highest to lowest
  eig_pairs.sort(reverse=True)

  # select the top k eig_vec
  feature=np.array([ele[1] for ele in eig_pairs[:k]])

  #get new data
  data=np.dot(norm_X,np.transpose(feature))

  return data

X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
print(pca(X,1))

最后一點(diǎn)感悟:果然還是要先把“內(nèi)功”給修煉好,不然學(xué)習(xí)這些會很花時間,學(xué)習(xí)PCA就將近花了一天時間。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容