PCA數學原理及程式設計實現

2021-08-04 22:22:18 字數 2453 閱讀 9120

一. 乙個場景

已知一家超市,銷售a,b,c,d四種產品,現對每種產品的一周之內每天的銷售情況記錄如下:

a    b   c    d

周一 2     0    8    9

周二 4     0   11  13

週三 3     1   10  12

周四 2     3   11  10

周五 1     0   12    9

週六10   11    1    2

週日11   12    2    1

我們將a,b,c,d在一周內的銷售情況分別記為事件a,事件b,事件c,事件d,則a,b,c,d均為乙個7維的向量,即我們可以得到4條7維向量組成的資料。

不難發現,a,b事件相似度高(在周一到周五銷售較少,在週六和週日銷售較多); c,d事件相似度高。於是,我們可以假設存在乙個向量t,將a,b,c,d分別投射到t上,得到乙個新的資料:

a    b   c    d

t   a'   b'   c'   d'

如果在這個向量t上,a和b的距離很近,c和d的距離很近,同時ab,cd的距離很遠,我們就成功的將乙個7維的資料降維到了一維。  

二. 降維目標抽象化

在上述場景中,我們並不知道向量t是什麼,也未明確如何表徵在向量t上,a,b,c,d之間的距離,同時,如果要將資料降為二維改如何表述呢?

實際上,對於上述t向量,我們需要使所有事件在向量t上的投影所組成的新陣列(a『,b',c',d')的方差最大,也就是在在t向量方向上,所有事件的差異可以最大化,故t向量即為這組4條7維陣列的第一主成分。而在與第一主成分垂直的六維空間裡,再尋找第二向量t2,使得所有事件在向量t2上的投影所組成的新陣列(a'',b'',c'',d'')的方差最大,向量t2即為這組4條7維陣列的第二主成分,以此類推,可獲得第一到第七主成分。

降維問題的優化目標:將一組n維向量(每一列為乙個記錄)降為k維(k大於0,小於n),其目標是選擇k個單位(模為1)正交基,使得原始資料變換到這組基上後,在各維度上兩兩間協方差為0,而每個維度內的方差則盡可能大(在正交的約束下,取最大的k個方差)。

三.演算法推演

1.假設原始矩陣為x(每列為乙個事件,每行為乙個特徵維度),x的協方差矩陣為c1;變換基矩陣為p,變換後的矩陣為y,y的協方差矩陣為c2;pca的實質就是找到矩陣p,使得c2為對角陣。

2.又, y=px, c1=xt(x), c2=yt(y); 故c2=(px)(t(px))=p(x(t(x))t(p)=pc1t(p)

3.故,優化目標變成了尋找乙個變換基矩陣p,滿足pc1t(p)是乙個對角矩陣,並且對角元素按從大到小依次排列,那麼p的前k行就是要尋找的基,用p的前k行組成的矩陣乘以x就使得x從n維降到了k維並滿足上述優化條件。

4.根據協方差矩陣的特徵,以其特徵值為行的矩陣即為變化矩陣p。

四.演算法

設有m條n維資料;

1)將原始資料按列組成n行m列矩陣x(每一列代表乙個事件,每一行代表乙個特徵值維度)

2)將x的每一行(代表乙個屬性字段)進行零均值化,即減去這一行的均值

3)求出協方差矩陣c=(1/m)xt(x)

4)求出協方差矩陣的特徵值及對應的特徵向量(模為1)

5)將特徵向量按對應特徵值大小從上到下按行排列成矩陣,取前k行組成矩陣p

6)y=px即為降維到k維後的資料

五.演算法實現:r語言

> a=c(2,4,3,2,1,10,11)

> b=c(0,0,1,3,0,11,12)

> c=c(8,11,10,11,12,1,2)

> d=c(9,13,12,10,9,2,1)

> sale=data.frame(a,b,c,d)

> rownames(sale)=c('mon','tue','wed','thu',"fri",'sat','sun')

> data.pca<-prcomp(sale)

> data.pca

standard deviations:

[1] 9.0818425 1.6889849 1.3284286 0.6531112

rotation:

pc1         pc2         pc3        pc4

a  0.4302964  0.62644196 -0.01270685 -0.6498108

b  0.5787863  0.11382130 -0.62985188  0.5053095

c -0.4840149 -0.09097089 -0.77652218 -0.3930232

d -0.4955613  0.76572807  0.01176625  0.4098062

> plot(x=data.pca$rotation[,1],y=data.pca$rotation[,2],pch=19,col=c(rep(2,length(data))),cex=1.25)

> biplot(data.pca)

> plot(data.pca, type="lines")

PCA的數學原理

pca的數學原理 pca principal component analysis 是一種常用的資料分析方法。pca通過線性變換將原始資料變換為一組各維度線性無關的表示,可用於提取資料的主要特徵分量,常用於高維資料的降維。網上關於pca的文章有很多,但是大多數只描述了pca的分析過程,而沒有講述其中...

PCA的數學原理 詳細

pca principal component analysis 是一種常用的資料分析方法。pca通過線性變換將原始資料變換為一組各維度線性無關的表示,可用於提取資料的主要特徵分量,常用於高維資料的降維。網上關於pca的文章有很多,但是大多數只描述了pca的分析過程,而沒有講述其中的原理。這篇文章的...

PCA的數學原理Matlab演示

pca principal component analysis 主成分分析,是svd singular value decomposition 奇異值分析的一種特殊情況。主要用於資料降維,特徵提取。這裡生成乙個3 3 的小矩陣便於說明。a rand 3,3 a 2.7694 1.3499 3.03...