2007 年,任天堂的遊戲機 Wii 上推出了一款超級紙片馬裡奧(super paper Mario)的遊戲。在大多數操作中,它十分接近傳統的超級馬裡奧,是一個 2D 的遊戲,玩家控制馬裡奧從左至右移動闖關,如下圖所示。
然而,這款遊戲與前作的最大區别是它加入了橫向卷軸(side-scrolling)功能。這相當于給玩家提供了全新的側視角機位(a side-view camera angle)。在這個側視角下,遊戲一下從 2D 擴展到 3D。比如上面那副遊戲畫面的從側視角來看,就變成了下面這樣。在 2D 圖中看似在同一平面上的兩組磚塊兒在 3D 視角中竟然有着完全不同的軸向坐标。
遊戲的大部分都在 2D 中進行。然而,在遊戲中,馬裡奧被賦予了“翻轉畫面”至 3D 的能力。通過這樣做,透視将發生移動、且 2D 畫面發生旋轉并顯示出隐藏的 Z 軸,将馬裡奧置于 3D 環境中。翻轉使玩家可以繞過 2D 中存在的障礙物,或者尋找僅在 Z 軸上才可見的物品和地形。
怎麼樣,有沒有“事情的脈絡早已非常清晰,隻是我們需要找到正确的視角”的感覺?
讓我們從這個遊戲引申一步。上面的遊戲畫面中,無論是馬裡奧,還是磚塊兒或者其他遊戲元素,構成它們的是屏幕上不同配色的像素,在計算機看來它們無非是大量的數據。這些數據在 2D 視角下呈現出一些模糊的結構,而“翻轉到 3D”使這個模糊的結構從一個全新的角度清晰地展現到我們面前,我們可以從中發現很多之前看不到的信息。
對于一組多變量的數據,通過轉換觀察數據的角度,揭示出數據内在的結構,這個過程就叫做主成分分析(principal component analysis,PCA)。主成分分析作為基礎的數學分析方法,其實際應用十分廣泛,比如人口統計學、分子動力學、數學建模、數理分析、以及量化投資等學科中均有應用,它是一種常用的多變量分析方法。
2 直觀理解 PCA在用統計方法分析多變量的數據集時,變量太多會大大增加問題的複雜性。此外,在很多問題中,變量之間普遍存在一定的線性相關性,這就造成了被不同變量所代表的數據信息有重疊。面對這些問題,一個自然的想法是“能否使用較少的但是沒有相關性的變量來獲取盡可能多的原始數據的信息?”。由此便提出了主成分分析(PCA)。
PCA 從原始變量出發,通過旋轉變化(即原始變量的線性組合)構建出一組新的、互不相關的新變量,這些變量盡可能多的解釋原始數據之間的差異性(即數據内在的結構),它們就稱為原始數據的主成分。由于這些變量不相關,因此它們無重疊的各自解釋一部分差異性。依照每個變量解釋的差異性大小排序,它們稱為第一主成分、第二主成分、以此類推。
來看一個生動的例子。
下面的動态圖展現了一組三維空間内看似雜亂無章的原始數據(看不出差異性)經過 PCA 變換後在新的變量(即圖中的坐标軸)視角下呈現的圖案。當我們用新的變量(坐标軸)來繪制這些數據時,它們所傳達的信息就更加清晰的呈現出來(由于數據點的差異性被體現出來,一團看似無序的散點變成了一隻企鵝圖案!)。這就是 PCA 的魅力。
下面就來看看 PCA 的數學含義。
3 數學含義——認清去均值化的重要性PCA 在數學上定義為一個正交線性變換(orthogonal linear transformation),将原始數據轉換到一個新的坐标系統,該系統中的坐标稱為主成分(principal components),它們相互正交,因此是不相關的。如果我們将原始數據投影到這些主成分上,它們滿足以下條件:
以此類推。
這些主成分構成了一組不相關的正交基集,每個主成分解釋了原始數據中的一部分差異性(由投影數據的方差表示);從第一主成分開始,解釋差異性的多少依次遞減。換句話說,如果我們想找到一個“視角”來觀察這些數據,使得它們看起來差别最明顯(比從任何其他角度看這些數據的差别都明顯),那麼這個“視角”就是第一主成分。
PCA 是一種降維(dimension reduction)分析方法;主成分的個數應小于或等于原始變量個數以及觀測值的個數。因此 PCA 能夠使用低維度的正交變量來解釋高維度(原始變量)的數據信息——我們将高維度的原始數據投影到低維度的 PCA 主成分中。
下面簡單說說如何從數學上求解主成分,從而引出 PCA 中一個非常關鍵的概念——去均值化(demean)。
假設 X 代表一個 n × p 的矩陣,每一行代表一個觀測值(因此一共有 n 個觀測值),每一列代表一個變量維度(因此有 p 個原始變量)。此外,在求解主成分前已經對原始數據中的每個維度都進行了去均值化,即 X 的每個列向量中的樣本數據的均值都為 0。去均值化對于 PCA 的分析結果是否正确至關重要。至于為什麼,請接着往下看。
我們首先來求解第一主成分。它是原始 p 個維度的線性組合。定義列向量 w_(1) 如下,它代表第一主成分中這 p 個維度的權重:
其中帶括号的下标 (1) 表示第一主成分,此外 w_(1) 的範數等于 1。X 中的每一行 x_i 為一個去均值化後的原始數據(它是一個 1×p 的行向量),因此它在第一主成分上的投影相當于 x_i 與 w_(1) 的内積。它是一個标量,它又稱為主成分得分(principal component score)。原始數據 x_i 在第一主成分上的投影,記為 t_i(1),為:
對于所有的原始數據 x_i 求出它們在第一主成分上的投影 t_i(1),下面要做的就是使這些投影點的方差最大。方差如何定義呢?方差是否等于所有 t_i(1) 的平方和呢?
在第一主成分對應的坐标軸上,t_i(1) 代表着原始數據 x_i 的投影點到該坐标系原點的距離。因此所有 t_i(1) 的平方和的數學含義是所有這些投影點到原點的距離的平方和(sum of squared deviation from origin)。
注意,重要的事情說三遍:
來看一個例子。假設二維空間中有兩個變量 v1 和 v2,以及它們的一組觀測值(如下圖左側的情況所示)。如果在進行 PCA 時未進行去均值化,則得到的第一主成分是一條通過原點的 45 度的直線。然而,即便是通過肉眼觀測我們也可以發現原始數據的方差在這個方向上并不是最大的。因此,這個第一主成分是錯誤的。
之所以會發生這樣的情況,是因為 PCA 是一種旋轉變換,因此得到的新的由主成分構成的坐标系必然要經過原始坐标系的原點。在這個例子中,原始觀測點聚集在坐标 (4, 4) 附近。如果不去均值化,坐标系統将圍繞着原始坐标系中的點 (0, 0) 旋轉。在這種情況下,在計算投影點到原點的距離平方和時,原點正是 (0, 0)。圖中 45 度斜線上方密密麻麻的黑點為原始數據的投影點,它們圍繞在 (4, 4) 附近。由于沒有去均值化,在計算距離平方和時,(0, 0) 到 (4, 4) 之間的距離的平方将被錯誤地算作投影點自身方差的一部分,使得投影點的方差在 45 度斜線這個方向上顯得最大,因此這個方向被錯誤地選為第一主成分。
正确的做法是對原始數據去均值化。這樣,原點被移動到原始數據的中心(如上圖中右側的情況)。圍繞着新的原點進行 PCA 便可以正确的發現真正的第一主成分,即穿過新原點的 135 度直線方向。由于已經移動了原點,因此投影點到原點的距離平方和就正比于投影點的方差。從上圖也不難看出,在該方向上的投影點的距離平方和最大,即方差最大。這就是為什麼在進行 PCA 之前要對原始數據去均值化。
在去均值化的前提下,“最大化投影點在第一主成分上的方差”等價于“找到 w_(1) 使 t_i(1)的平方和最大”。這就意味着,第一主成分的權重 w_(1) 是下面這個最優化問題的解:
将上式右側寫成矩陣形式為:
可以證明,上式右側中的優化函數的最大值為對稱矩陣 (X^T)X 的最大特征值(the largest eigenvalue),該值當 w 取為這個特征值對應的特征向量(eigenvector)時實現。這裡先埋個伏筆,看完下一節你就知道這裡為什麼特意引出對稱矩陣 (X^T)X,以及它的特征向量和特征值。
求出 w_(1) 之後,便找到了第一主成分。原始數據在第一主成分上的投影就是 t_i(1)。确定了第一主成分後,便可以依次确定第二、第三主成分,以此類推。具體的,假設已經确定了前 k - 1 個主成分(k ≥ 2),為了确定第 k 個主成分,隻需要從原始數據 X 中減去前 k - 1 個主成分,然後對剩餘的新的數據進行投影點到原點距離平方和最大化的求解,從而得到第 k 個主成分的權重向量 w_(k)。
這種方法聽起來比較繁瑣,因為要通過疊代依次找到主成分。但我的目的是想通過對數學步驟的描述強調去均值化的重要性。在實際應用時,PCA 可以通過對原始 n × p 維的數據 X進行協方差矩陣的特征分解求得。
4 對協方差矩陣進行特征值分解在上節的數學推導中曾留下一個伏筆:求解去均值化後的數據 X 的第一主成分等價于求解對稱矩陣 (X^T)X 的最大特征值對應的特征向量。事實上,求解 X 的前 k 個主成分就相當于求解對稱矩陣 (X^T)X 的最大的 k 個特征值各自對應的特征向量。它們就是 X 的 k 個主成分。
再來看看 (X^T)X 是什麼。去均值化後,對稱矩陣 (X^T)X 正比于 X 的協方差矩陣。事實上,X 的協方差矩陣正是 Cov(X) = (X^T)X / (n-1)。注意:如果未對 X 進行去均值化,則 Cov(X) 不等于 (X^T)X / (n-1)。
根據上面的論述,我們隻需首先對原始數據去均值化并求出它的協方差矩陣;在得到協方差矩陣後,對該矩陣進行特征值分解(eigen-decomposition)得到特征值和特征向量;之後,将特征值從大到小排序,取前 k 個特征值對應的特征向量,它們就是我們要找的 k 個主成分。
根據協方差的定義,計算協方差的過程中便已對數據進行了去均值化,因此對于求解代表主成分的特征向量,并不需要在求協方差均值之前人工對數據去均值化。然而,考慮到 PCA 是旋轉變換且坐标系統的原點應該位于多變量數據的多維均值之上,因此在計算原始數據點在主成分上的投影時,仍應将數據進行去均值化處理。此外,除了本節介紹的協方差矩陣的特征值分解外,還有其他求解 PCA 的方法,比如 Python 的 sklearn 統計包使用的是對矩陣 X 直接進行奇異值分解(singular value decomposition,SVD)。在采用這種解法時,如果沒有人工對數據去均值,那麼SVD的計算結果便有可能是錯誤的。因此,在進行 PCA 時,無論是用什麼方法,首先應對數據去均值化。
下面通過一個例子來說明對協方差矩陣進行特征值分解的過程。
假設有兩個變量 A 和 B 的 10 個觀測點,如下表所示。我們希望找出它們的第一主成分。
第一步:去均值,得到去均值化後的數據
第二步:計算協方差矩陣
去均值化後數據的協方差矩陣為:
第三步:對協方差矩陣進行特征值分解
得到特征值為 0.07650136 和 1.36494309。二者中較大特征值對應的特征向量為:[-0.68212146, -0.73123889]^T,這就是數據的第一主成分。
第四步:計算原始數據在第一主成分上的投影
用去均值後的數據和第一主成分内積,便得到原始數據在第一主成分上的投影。為了驗證結果的正确性,我們同時采用 Python 的 sklearn 包自帶的 PCA 計算第一主成分。從下表的結果可以看到,上述計算和使用軟件包的計算結果是一緻的。
來看看第一主成分在二維平面上是什麼方向的。下圖中,藍色的圓圈是原始去均值化後的數據,綠色的直線是第一主成分的坐标軸。紅色的方塊是原始數據在其上的投影。不難看出,在第一主成分上,投影點的方差最大。如果我們把這 10 個點投影到非第一主成分的其他方向上,那些投影點的方差都沒有第一主成分上這些投影點的方差大。即第一主成分是最能夠體現這些點之間差異化的那個視角。
最後——last but not least——想指出的一點是,PCA 對原始變量的相對尺度十分敏感。如果在一組變量中,某一個變量的量綱非常大,那麼這個變量很可能主宰觀測數據的方差,導緻第一主成分非常接近這個變量,而這樣的結果往往沒有太大的意義。
比如在一個問題中,某一個變量是長度,如果我們把它的單位從米改成厘米,則數量級大了 100 倍,計算方差的時候該變量方差的數量級則大了 10000 倍。然而量綱的變化對于數據本身的内部結構并沒有改變,但我們會因此錯誤的認為長度這個變量是一個解釋方差的最重要因素,這就有問題了。
因此,在進行 PCA 時,往往有必要結合數據的業務含義對變量進行尺度縮放(scaling),使得不同變量之間在量綱上具有可比性。需要強調的是,在 scaling 的技巧中并沒有标準答案,因此需要具體問題具體分析。
下面這兩個示例圖展示了是否 scaling 對 PCA 結果的影響。上圖中,由于沒有 scaling,導緻得到的第一主成分完全秒殺了其他主成分,這樣會使使用者認為數據之間的區别僅僅存在于第一主成分中。而經過适當的 scaling 後(下圖),PCA 的結果更加合理,前四個主成分依次解釋了數據中的方差。
6 結語,PCA 與量化投資
在分析多變量數據時,變量之間錯綜複雜的相關性往往為我們探究其内部的結構設置了層層障礙。而不同變量之間傳遞的帶有重疊性的信息更會使我們錯誤的高估一些變量的作用。
放眼量化投資領域,多因子量化選股無疑是一個可以使用 PCA 來分析的課題。人們主觀的将因子歸納為估值因子、質量因子、成長因子、動量因子等,就是希望降低不同類别因子之間的相關性,使它們各自代表股票超額收益中不同的風險敞口。然而,由于這些因子都是來自市場交易數據以及公司财報,它們之間一定存在着千絲萬縷的聯系(即相關性)。如果我們想要徹底排除因子之間的相關性、降低分析問題的複雜性、同時捕捉到股票在不同因子之上的差異,PCA 無疑會有用武之地。它可以把傳統的因子轉化為一組完全正交的主成分,這有助于提高量化選股的準确性。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!