目錄
PCA思想
PCA主要用於數據降維,是一種無監督學習方法。主成分分析利用正交變換將可能存在相關性的原始屬性轉換成一組線性無關的新屬性,並通過選擇重要的新屬性實現降維。由一系列特征組成的多維向量,其中某些元素本身沒有區分性,比如某個元素在所有樣本中都相等,或者彼此差距不大,那么那個元素對於區分的貢獻度小。我們的目的即為找到那些方差大的維,去掉變化不大的維。
將 n 維特征映射到 k 維上(k<n
),這 k 維是全新的正交特征
,是互不相關的。這 k 維特征稱為主元,是重新構造出來的 k 維特征,而不是簡單地從 n 維特征中去除其余 n‐k 維特征。PCA可以對新求出的“主元”向量的重要性進行排序,而每個新變量是原有變量的線性組合,體現原有變量的綜合效果,這些新變量又稱為“主成分”,它們可以在很大程度上反映原來n個變量的影響。
主成分分析的解滿足最大方差和最小均方誤差兩類約束條件,因而具有最大可分性和最近重構性。
問題形式化表述
從n維降到k維:找k個向量\(u^{(1)},u^{(2)},...,u^{(k)}\),將數據垂直映射到每個向量上,然后最小化映射誤差(projection error,距離均方誤差).
PCA之協方差矩陣
協方差定義
若等於0,則稱X和Y不相關.
協方差的上界是\(|Conv(X,Y)|\le\sigma_1\sigma_2\),其中,\(Var(X)=\sigma_1^2,Var(Y)=\sigma_2^2\),當且僅當X和Y之間有線性關系時,等號成立.兩邊除以\(\sigma_1\sigma_2\)得到Pearson相關系數.
協方差矩陣常用來篩選特征(特征降維).
如對矩陣X進行降維,\(X\in \mathbb R^{m\times n}\),並且已去過均值:
目標是使得每個行向量的方差盡可能大,而行向量間的協方差為0(行與行之間的相關性盡可能小).(最大方差理論)
X對應的協方差矩陣為:
協方差矩陣是對稱半正定,主對角線元為每個行向量的方差,次對角線元為行向量間的協方差.
協方差大於 0 表示 x 和 y 若有一個增,另一個也增;小於 0 表示一個增,一個減;協方差為 0 時,兩者獨立。協方差絕對值越大,兩者對彼此的影響越大,反之越小。
矩陣-特征值
特征值(eigen value),特征向量(eigen vector)
\(A\mathbb x=\bbox[5px,border:1px solid red]\lambda\ \mathbb x\),則常數\(\lambda\)為矩陣A的特征值,\(\mathbb x\)為\(\lambda\)對應的特征向量.可以有多個.
PCA運算步驟
基礎算法:
-
從數據中減去均值,每個樣本除以各自的方差(方差歸一化)(預處理的實質是將坐標原點移到樣本點的中心點)
-
求特征協方差矩陣
-
求協方差矩陣的特征值和特征向量
-
將特征值按照從大到小的順序排序,選擇其中最大的 k 個,然后將其對應的 k個特征向量分別作為列向量組成特征向量矩陣。
-
將樣本點投影到選取的特征向量上。假設樣例數為 m,特征數為 n,減去均值后的樣本矩陣為 DataAdjust(mXn),協方差矩陣是 nXn,選取的 k 個特征向量組成的矩陣為EigenVectors(nXk)。那么投影后的數據 FinalData 為
\[\text{FinalData}(m \times k) =\text{DataAdjust}(m \times n)\times \text{EigenVectors}(n \times k) \]
這樣,就將原始樣例的 n 維特征變成了 k 維,這 k 維就是原始特征在 k 維上的投影,代表了原始的n個特征。
PCA理論解釋
有三個理論可以解釋為什么協方差矩陣的特征向量作為k維理想特征:
- 最大方差理論
- 最小平方誤差理論
- 坐標軸相關度理論
最大方差理論
在信號處理中認為信號具有較大的方差,噪聲有較小的方差,信噪比就是信號與噪聲的方差比,越大越好。
理論
,最好的 k 維特征是將 n 維樣本點轉換為 k 維后,每一維上的樣本方差都
很大。降維的過程即高維向低維映射的過程(向一些軸投影).
投影
的概念:向量\(\mathbb x^{(i)}=(x_1^{(i)},x_2^{(i)},\dots,x_n^{(i)})^T\)在單位向量\(u=(u_1,u_2,\dots,u_n)^T\)(代表某條直線的方向向量)上的投影的長度為:\(\langle x^{(i)},u \rangle ={x^{(i)}}^Tu=u^Tx^{(i)}\).
由於數據預處理后每一維度均值為0,投影后仍為0,因此方差為:
最后一個等號后邊的二次項的中間部分即為樣本特征的協方差矩陣.
用A來表示該協方差矩陣,用\(\lambda\)表示方差(目標函數),則上式寫作:
由於 u 是單位向量,即\(u^Tu=1\),上式兩邊都左乘 u 得, \(u\lambda=\lambda u=uu^TAu=Au\),即\(Au=\lambda u\)
可以看出,\(\lambda\)就是A的特征值,u是特征向量.最佳的投影直線是特征值λ最大時對應的特征向量,其次是λ第二大對應的特征向量,依次類推。
因此,我們只需要對協方差矩陣進行特征值分解,得到的前 k 大特征值對應的特征向量就是最佳的 k 維新特征,而且這 k 維新特征是正交的。得到前 k 個 u 以后,樣例 x 通過以下變換可以得到新的樣本:
PCA 將 n 個特征降維到 k 個,可以用來進行數據壓縮,如果 100 維的向量最后可以用10 維來表示,那么壓縮率為 90%。同樣圖像處理領域的 KL 變換使用 PCA 做圖像壓縮。但PCA 要保證降維后,還要保證數據的特性損失最小。
性質
- 保守方差是最大的
- 最終的重構誤差(從變換后特征回到原始特征)是最小的。
由於PCA只是簡單對輸入數據進行變換,所以它既可以用於分類問題也可用於回歸問題。
優點:不需要設定參數,結果僅與數據有關。可以方便的應用到各個場合。
參數k的選取
在主成分分析中,保留的主成分的數目是由用戶來確定的。一個經驗方法是保留所有大於1的特征值,以其對應的特征向量來做坐標變換。此外,也可以根據不同特征值在整體中的貢獻,以一定的比例進行保留,即計算降維后的數據與原始數據之間的誤差,令誤差和原始數據能量的比值小於某個預先設定的閾值,選擇使如下不等式成立的最小的k:
可以表述為原數據99%的方差被保留。分子是映射均方誤差,分母是數據的總方差.降維之后損失的信息越多,方差越小.然而,上述公式不能直接計算,實際中用到奇異值分解:[U,S,V] = svd(X). svd得到的S是個對角矩陣,選擇使如下不等式成立的最小的k:
數據重建
如何從壓縮表示的數據中重建原本的數據?
壓縮(降維)過程:\(z=U^T_{reduce}x\)
重建近似數據:\(X_{approx}=U_{reduce}z\)
主觀理解
從主觀的理解上,主成分分析到底是什么?它其實是對數據在高維空間下的一個投影轉換,通過一定的投影規則將原來從一個角度看到的多個維度映射成較少的維度。到底什么是映射,下面的圖就可以很好地解釋這個問題——正常角度看是兩個半橢圓形分布的數據集,但經過旋轉(映射)之后是兩條線性分布數據集。
變換后的各分量,它們所包括的信息量不同,呈逐漸減少趨勢。事實上,第一主分量集中了最大的信息量,常常占80%以上。第二、三主分量的信息量依次很快遞減,到
了第N分量,信息幾乎為零。選擇較少的主成分來表示數據不但可以用作特征降維,還可以用來消除數據中的噪聲。在信號處理中認為信號具有較大的方差,噪聲有較小的方差。在很多情況下,在特征值譜中排列在后面的主成分(次成分)往往反映了數據中的隨機噪聲。因此,如果把特征值很小的成分置為0,再反變換回原空間,則實現了對原數據的降噪。
應用
從神經科學到計算機圖形學都有它的用武之地。被譽為應用線形代數最有價值的結果之一。
- 壓縮降維:
- 降低存儲大小;
- 加快監督學習的過程
- 數據可視化(通常是2D,3D)
雖然可能能夠降低模型過擬合,但不是防止過擬合的根本方法,應該考慮對參數加正則項.在設計機器學習系統之前不要急着想要使用PCA,應該先使用原始數據,效果不好或系統不能承受(計算,存儲量大等)再使用PCA.
代碼示例
# Transforming the data
n_components=2
pca = PCA(n_components)
X_reduced = pca.fit_transform(X)
# ('X Shape: ', (70000, 784)),X_reduced.shape=(70000, 2)
# Important thing - How much variance is explained by each dimension
print ('Ratio of variance explained: ', pca.explained_variance_ratio_)
# ('Ratio of variance explained: ', array([ 0.09746116, 0.07155445]))
principal_components = pca.components_ # (2, 784)
# Reconstructing data
pca_rec = PCA(n_components)
X_reduced_rec = pca_rec.fit_transform(X)
principal_components_rec = pca_rec.components_
rec = np.dot(X_reduced_rec, principal_components_rec)