數據的向量表示、降維問題及PCA算法

內容來源:http://blog.codinglabs.org/articles/pca-tutorial.html

在數據挖掘或機器學習工作中,數據常被表示爲向量。

比如,某個淘寶店2012年全年的流量及交易情況可以看成一組記錄的集合,其中每一天的數據是一條記錄,格式如下:

(日期, 瀏覽量, 訪客數, 下單數, 成交數, 成交金額)

其中“日期”是一個記錄標誌而非度量值,而數據挖掘關心的大多是度量值,因此如果我們忽略日期這個字段後,我們得到一組記錄,每條記錄可以被表示爲一個五維向量,其中一條看起來大約是這個樣子:

(500,240,25,13,2312.15)T

當然僅僅處理這一組五維的數據對我們來說無所謂,但是實際機器學習中處理成千上萬甚至幾十萬維的情況也並不罕見,在這種情況下,機器學習的資源消耗是不可接受的,因此我們必須對數據進行降維。

降維當然意味着信息的丟失,不過鑑於實際數據本身常常存在的相關性,我們可以想辦法在降維的同時將信息的損失儘量降低。

舉個例子,假如某學籍數據有兩列M和F,其中M列的取值是如何此學生爲男性取值1,爲女性取值0;而F列是學生爲女性取值1,男性取值0。此時如果我們統計全部學籍數據,會發現對於任何一條記錄來說,當M爲1時F必定爲0,反之當M爲0時F必定爲1。在這種情況下,我們將M或F去掉實際上沒有任何信息的損失,因爲只要保留一列就可以完全還原另一列。

再例如上面淘寶店鋪的數據,從經驗我們可以知道,“瀏覽量”和“訪客數”往往具有較強的相關關係,而“下單數”和“成交數”也具有較強的相關關係。這種情況表明,如果我們刪除瀏覽量或訪客數其中一個指標,我們應該期待並不會丟失太多信息。因此我們可以刪除一個,以降低機器學習算法的複雜度。

1. 向量的表示

1.1 內積與投影

兩個維數相同的向量的內積被定義爲:

直觀表示:內積運算將兩個向量映射爲一個實數

1.1.1 內積的幾何意義

假設A和B均爲二維向量,則A=(x1,y1)A=(x1,y1),B=(x2,y2)B=(x2,y2)。則在二維平面上A和B可以用兩條發自原點的有向線段表示:

                                                     

從A點向B所在直線引一條垂線。我們知道垂線與B的交點叫做A在B上的投影,再設A與B的夾角是a,則投影的矢量長度爲|A|cos(a),其中 |A| 是向量A的模,也就是A線段的標量長度。

這裏區分一下矢量長度和標量長度,標量長度總是大於等於0,值就是線段的長度;而矢量長度可能爲負,其絕對值是線段長度,而符號取決於其方向與標準方向相同或相反。

將內積表示爲另一種我們熟悉的形式:A與B的內積等於A到B的投影長度乘以B的模。

再進一步,如果我們假設B的模爲1,即讓|B|=1,那麼就變成了

內積幾何解釋:設向量B的模爲1,則A與B的內積值等於A向B所在直線投影的矢量長度

1.2 基

在代數表示方面,我們經常用線段終點的點座標表示向量,例如向量可以表示爲(3,2),不過我們常常忽略,只有一個(3,2)本身是不能夠精確表示一個向量的。我們仔細看一下,這裏的3實際表示的是向量在x軸上的投影值是3,在y軸上的投影值是2。也就是說我們其實隱式引入了一個定義:以x軸和y軸上正方向長度爲1的向量爲標準。那麼一個向量(3,2)實際是說在x軸投影爲3而y軸的投影爲2

更正式的說,向量(x,y)實際上表示線性組合:

不難證明所有二維向量都可以表示爲這樣的線性組合。

此處(1,0)和(0,1)叫做二維空間中的一組基

                                                     

要準確描述向量,首先要確定一組基,然後給出在基所在的各個直線上的投影值,就可以了。只不過我們經常省略第一步,而默認以(1,0)和(0,1)爲基。

我們之所以默認選擇(1,0)和(0,1)爲基,當然是比較方便,因爲它們分別是x和y軸正方向上的單位向量,因此就使得二維平面上點座標和向量一一對應,非常方便。但實際上任何兩個線性無關的二維向量都可以成爲一組基,所謂線性無關在二維平面內可以直觀認爲是兩個不在一條直線上的向量。

(1,1)和(-1,1)也可以成爲一組基。一般來說,我們希望基的模是1,因爲從內積的意義可以看到,如果基的模是1,那麼就可以方便的用向量點乘基而直接獲得其在新基上的座標了。

實際上,對應任何一個向量我們總可以找到其同方向上模爲1的向量,只要讓兩個分量分別除以模就好了。例如,上面的基可以變爲(\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}})(-\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}}),現在,我們想獲得(3,2)在新基上的座標,即在兩個方向上的投影矢量值,那麼根據內積的幾何意義,我們只要分別計算(3,2)和兩個基的內積,不難得到新的座標爲(\frac{5}{\sqrt{2}},-\frac{1}{\sqrt{2}})

1.3 基變換

將(3,2)變換爲新基上的座標,就是用(3,2)與第一個基做內積運算,作爲第一個新的座標分量,然後用(3,2)與第二個基做內積運算,作爲第二個新座標的分量,實際上,我們可以用矩陣相乘的形式簡潔的表示這個變換:

\begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ -1/\sqrt{2} & 1/\sqrt{2} \end{pmatrix} \begin{pmatrix} 3 \\ 2 \end{pmatrix} = \begin{pmatrix} 5/\sqrt{2} \\ -1/\sqrt{2} \end{pmatrix}

太漂亮了!其中矩陣的兩行分別爲兩個基,乘以原向量,其結果剛好爲新基的座標。可以稍微推廣一下,如果我們有m個二維向量,只要將二維向量按列排成一個兩行m列矩陣,然後用“基矩陣”乘以這個矩陣,就得到了所有這些向量在新基下的值。例如(1,1),(2,2),(3,3),想變換到剛纔那組基上,則可以這樣表示:

\begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ -1/\sqrt{2} & 1/\sqrt{2} \end{pmatrix} \begin{pmatrix} 1 & 2 & 3 \\ 1 & 2 & 3 \end{pmatrix} = \begin{pmatrix} 2/\sqrt{2} & 4/\sqrt{2} & 6/\sqrt{2} \\ 0 & 0 & 0 \end{pmatrix}

於是一組向量的基變換被幹淨的表示爲矩陣的相乘。

一般的,如果我們有M個N維向量,想將其變換爲由R個N維向量表示的新空間中,那麼首先將R個基按行組成矩陣A,然後將向量按列組成矩陣B,那麼兩矩陣的乘積AB就是變換結果,其中AB的第m列爲A中第m列變換後的結果

\begin{pmatrix} p_1 \\ p_2 \\ \vdots \\ p_R \end{pmatrix} \begin{pmatrix} a_1 & a_2 & \cdots & a_M \end{pmatrix} = \begin{pmatrix} p_1a_1 & p_1a_2 & \cdots & p_1a_M \\ p_2a_1 & p_2a_2 & \cdots & p_2a_M \\ \vdots & \vdots & \ddots & \vdots \\ p_Ra_1 & p_Ra_2 & \cdots & p_Ra_M \end{pmatrix}

這裏R可以小於N,而R決定了變換後數據的維數。也就是說,我們可以將一N維數據變換到更低維度的空間中去,變換後的維度取決於基的數量。因此這種矩陣相乘的表示也可以表示降維變換。

上述分析同時給矩陣相乘找到了一種物理解釋:

兩個矩陣相乘的意義是將右邊矩陣中的每一列列向量變換到左邊矩陣中每一行行向量爲基所表示的空間中去

更抽象的說,一個矩陣可以表示一種線性變換。

 

1.4 協方差矩陣及優化目標

上面我們討論了選擇不同的基可以對同樣一組數據給出不同的表示,而且如果基的數量少於向量本身的維數,則可以達到降維的效果。但是我們還沒有回答一個最最關鍵的問題:如何選擇基纔是最優的。或者說,如果我們有一組N維向量,現在要將其降到K維(K小於N),那麼我們應該如何選擇K個基才能最大程度保留原有的信息?

假設我們的數據由五條記錄組成,將它們表示成矩陣形式:

\begin{pmatrix} 1 & 1 & 2 & 4 & 2 \\ 1 & 3 & 3 & 4 & 4 \end{pmatrix}

其中每一列爲一條數據記錄,而一行爲一個字段。爲了後續處理方便,我們首先將每個字段內所有值都減去字段均值,其結果是將每個字段都變爲均值爲0(這樣做的道理和好處後面會看到)。

我們看上面的數據,第一個字段均值爲2,第二個字段均值爲3,所以變換後:

\begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix}

我們可以看下五條數據在平面直角座標系內的樣子:

現在問題來了:如果我們必須使用一維來表示這些數據,又希望儘量保留原始的信息,你要如何選擇?

通過上一節對基變換的討論我們知道,這個問題實際上是要在二維平面中選擇一個方向,將所有數據都投影到這個方向所在直線上,用投影值表示原始記錄。這是一個實際的二維降到一維的問題。

那麼如何選擇這個方向(或者說基)才能儘量保留最多的原始信息呢?

一種直觀的看法是:希望投影后的投影值儘可能分散。

以上圖爲例,可以看出如果向x軸投影,那麼最左邊的兩個點會重疊在一起,中間的兩個點也會重疊在一起,於是本身四個各不相同的二維點投影后只剩下兩個不同的值了,這是一種嚴重的信息丟失,同理,如果向y軸投影最上面的兩個點和分佈在x軸上的兩個點也會重疊。所以看來x和y軸都不是最好的投影選擇。我們直觀目測,如果向通過第一象限和第三象限的斜線投影,則五個點在投影后還是可以區分的。

下面,我們用數學方法表述這個問題。

上文說到,我們希望投影后投影值儘可能分散,而這種分散程度,可以用數學上的方差來表述。此處,一個字段的方差可以看做是每個元素與字段均值的差的平方和的均值,即:

Var(a)=\frac{1}{m}\sum_{i=1}^m{(a_i-\mu)^2}

由於上面我們已經將每個字段的均值都化爲0了,因此方差可以直接用每個元素的平方和除以元素個數表示:

Var(a)=\frac{1}{m}\sum_{i=1}^m{a_i^2}

於是上面的問題被形式化表述爲:尋找一個一維基,使得所有數據變換爲這個基上的座標表示後,方差值最大。

1.4.3 協方差

對於上面二維降成一維的問題來說,找到那個使得方差最大的方向就可以了。不過對於更高維,還有一個問題需要解決。考慮三維降到二維問題。與之前相同,首先我們希望找到一個方向使得投影后方差最大,這樣就完成了第一個方向的選擇,繼而我們選擇第二個投影方向。

如果我們還是單純只選擇方差最大的方向,很明顯,這個方向與第一個方向應該是“幾乎重合在一起”,顯然這樣的維度是沒有用的,因此,應該有其他約束條件。從直觀上說,讓兩個字段儘可能表示更多的原始信息,我們是不希望它們之間存在(線性)相關性的,因爲相關性意味着兩個字段不是完全獨立,必然存在重複表示的信息。

數學上可以用兩個字段的協方差表示其相關性,由於已經讓每個字段均值爲0,則:

Cov(a,b)=\frac{1}{m}\sum_{i=1}^m{a_ib_i}

在字段均值爲0的情況下,兩個字段的協方差簡潔的表示爲其內積除以元素數m

至此,我們得到了降維問題的優化目標:將一組N維向量降爲K維(K大於0,小於N),其目標是選擇K個單位(模爲1)正交基,使得原始數據變換到這組基上後,各字段兩兩間協方差爲0,而字段的方差則儘可能大(在正交的約束下,取最大的K個方差)。

1.4.3 協方差矩陣

上面我們導出了優化目標,但是這個目標似乎不能直接作爲操作指南(或者說算法),因爲它只說要什麼,但根本沒有說怎麼做。所以我們要繼續在數學上研究計算方案。

我們看到,最終要達到的目的與字段內方差及字段間協方差有密切關係。因此我們希望能將兩者統一表示,仔細觀察發現,兩者均可以表示爲內積的形式,而內積又與矩陣相乘密切相關。於是我們來了靈感:

假設我們只有a和b兩個字段,那麼我們將它們按行組成矩陣X:

X=\begin{pmatrix} a_1 & a_2 & \cdots & a_m \\ b_1 & b_2 & \cdots & b_m \end{pmatrix}

然後我們用X乘以X的轉置,並乘上係數1/m:

\frac{1}{m}XX^\mathsf{T}=\begin{pmatrix} \frac{1}{m}\sum_{i=1}^m{a_i^2} & \frac{1}{m}\sum_{i=1}^m{a_ib_i} \\ \frac{1}{m}\sum_{i=1}^m{a_ib_i} & \frac{1}{m}\sum_{i=1}^m{b_i^2} \end{pmatrix}

奇蹟出現了!這個矩陣對角線上的兩個元素分別是兩個字段的方差,而其它元素是a和b的協方差。兩者被統一到了一個矩陣的。

根據矩陣相乘的運算法則,這個結論很容易被推廣到一般情況:

設我們有m個n維數據記錄,將其按列排成n乘m的矩陣X,設C=\frac{1}{m}XX^\mathsf{T},則C是一個對稱矩陣,其對角線分別個各個字段的方差,而第i行j列和j行i列元素相同,表示i和j兩個字段的協方差

1.4.4 協方差矩陣對角化

根據上述推導,我們發現要達到優化目前,等價於將協方差矩陣對角化:即除對角線外的其它元素化爲0,並且在對角線上將元素按大小從上到下排列,這樣我們就達到了優化目的。這樣說可能還不是很明晰,我們進一步看下原矩陣與基變換後矩陣協方差矩陣的關係:

設原始數據矩陣X對應的協方差矩陣爲C,而P是一組基按行組成的矩陣,設Y=PX,則Y爲X對P做基變換後的數據。設Y的協方差矩陣爲D,我們推導一下D與C的關係:

\begin{array}{l l l} D & = & \frac{1}{m}YY^\mathsf{T} \\ & = & \frac{1}{m}(PX)(PX)^\mathsf{T} \\ & = & \frac{1}{m}PXX^\mathsf{T}P^\mathsf{T} \\ & = & P(\frac{1}{m}XX^\mathsf{T})P^\mathsf{T} \\ & = & PCP^\mathsf{T} \end{array}

現在事情很明白了!我們要找的P不是別的,而是能讓原始協方差矩陣對角化的P。換句話說,優化目標變成了尋找一個矩陣P,滿足PCPTPCPT是一個對角矩陣,並且對角元素按從大到小依次排列,那麼P的前K行就是要尋找的基,用P的前K行組成的矩陣乘以X就使得X從N維降到了K維並滿足上述優化條件

現在所有焦點都聚焦在了協方差矩陣對角化問題上

由上文知道,協方差矩陣C是一個是對稱矩陣,在線性代數上,實對稱矩陣有一系列非常好的性質:

1)實對稱矩陣不同特徵值對應的特徵向量必然正交。

2)設特徵向量λλ重數爲r,則必然存在r個線性無關的特徵向量對應於λλ,因此可以將這r個特徵向量單位正交化

由上面兩條可知,一個n行n列的實對稱矩陣一定可以找到n個單位正交特徵向量,設這n個特徵向量爲e1,e2,⋯,ene1,e2,⋯,en,我們將其按列組成矩陣:

E=\begin{pmatrix} e_1 & e_2 & \cdots & e_n \end{pmatrix}

則對協方差矩陣C有如下結論:

E^\mathsf{T}CE=\Lambda=\begin{pmatrix} \lambda_1 & & & \\ & \lambda_2 & & \\ & & \ddots & \\ & & & \lambda_n \end{pmatrix}

其中Λ爲對角矩陣,其對角元素爲各特徵向量對應的特徵值

到這裏,我們發現我們已經找到了需要的矩陣P:

P=E^\mathsf{T}

P是協方差矩陣的特徵向量單位化後按行排列出的矩陣,其中每一行都是C的一個特徵向量。如果設P按照Λ中特徵值的從大到小,將特徵向量從上到下排列,則用P的前K行組成的矩陣乘以原始數據矩陣X,就得到了我們需要的降維後的數據矩陣Y。

 1.5 PCA算法實例

PCA的算法步驟:

設有m條n維數據。

1)將原始數據按列組成n行m列矩陣X

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

3)求出協方差矩陣C=1mXXTC=1mXXT

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

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

6)Y=PXY=PX即爲降維到k維後的數據

例如數據,用PCA方法將這組二維數據其降到一維。

\begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix}

因爲這個矩陣的每行已經是零均值,這裏我們直接求協方差矩陣:

C=\frac{1}{5}\begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix}\begin{pmatrix} -1 & -2 \\ -1 & 0 \\ 0 & 0 \\ 2 & 1 \\ 0 & 1 \end{pmatrix}=\begin{pmatrix} \frac{6}{5} & \frac{4}{5} \\ \frac{4}{5} & \frac{6}{5} \end{pmatrix}

求其特徵值和特徵向量:求解後特徵值爲

\lambda_1=2,\lambda_2=2/5

其對應的特徵向量分別是:

c_1\begin{pmatrix} 1 \\ 1 \end{pmatrix},c_2\begin{pmatrix} -1 \\ 1 \end{pmatrix}

其中對應的特徵向量分別是一個通解,c1和c2可取任意實數。那麼標準化後的特徵向量爲:

\begin{pmatrix} 1/\sqrt{2} \\ 1/\sqrt{2} \end{pmatrix},\begin{pmatrix} -1/\sqrt{2} \\ 1/\sqrt{2} \end{pmatrix}

因此我們的矩陣P是:

P=\begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ -1/\sqrt{2} & 1/\sqrt{2} \end{pmatrix}

可以驗證協方差矩陣C的對角化:

PCP^\mathsf{T}=\begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ -1/\sqrt{2} & 1/\sqrt{2} \end{pmatrix}\begin{pmatrix} 6/5 & 4/5 \\ 4/5 & 6/5 \end{pmatrix}\begin{pmatrix} 1/\sqrt{2} & -1/\sqrt{2} \\ 1/\sqrt{2} & 1/\sqrt{2} \end{pmatrix}=\begin{pmatrix} 2 & 0 \\ 0 & 2/5 \end{pmatrix}

最後我們用P的第一行乘以數據矩陣,就得到了降維後的表示:

Y=\begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} \end{pmatrix}\begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix}=\begin{pmatrix} -3/\sqrt{2} & -1/\sqrt{2} & 0 & 3/\sqrt{2} & -1/\sqrt{2} \end{pmatrix}

降維投影結果如下圖:

1.6 conclude

根據上面對PCA的數學原理的解釋,我們可以瞭解到一些PCA的能力和限制。PCA本質上是將方差最大的方向作爲主要特徵,並且在各個正交方向上將數據“離相關”,也就是讓它們在不同正交方向上沒有相關性。

因此,PCA也存在一些限制,例如它可以很好的解除線性相關,但是對於高階相關性就沒有辦法了,對於存在高階相關性的數據,可以考慮Kernel PCA,通過Kernel函數將非線性相關轉爲線性相關,關於這點就不展開討論了。另外,PCA假設數據各主特徵是分佈在正交方向上,如果在非正交方向上存在幾個方差較大的方向,PCA的效果就大打折扣了。

最後需要說明的是,PCA是一種無參數技術,也就是說面對同樣的數據,如果不考慮清洗,誰來做結果都一樣,沒有主觀參數的介入,所以PCA便於通用實現,但是本身無法個性化的優化。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章