1.相關背景 在許多領域的研究與應用中,一般須要對含有多個變量的數據進行觀測,收集大量數據後進行分析尋找規律。多變量大數據集無疑會爲研究和應用提供豐富的信息,可是也在必定程度上增長了數據採集的工做量。更重要的是在不少情形下,許多變量之間可能存在相關性,從而增長了問題分析的複雜性。若是分別對每一個指標進行分析,分析每每是孤立的,不能徹底利用數據中的信息,所以盲目減小指標會損失不少有用的信息,從而產生錯誤的結論。html
所以須要找到一種合理的方法,在減小須要分析的指標同時,儘可能減小原指標包含信息的損失,以達到對所收集數據進行全面分析的目的。因爲各變量之間存在必定的相關關係,所以能夠考慮將關係緊密的變量變成儘量少的新變量,使這些新變量是兩兩不相關的,那麼就能夠用較少的綜合指標分別表明存在於各個變量中的各種信息。主成分分析與因子分析就屬於這類降維算法。python
主要思想:經過拋棄攜帶信息量較少的維度對數據進行降維處理,從而加速機器學習進程。算法
降維就是一種對高維度特徵數據預處理方法。降維是將高維度的數據保留下最重要的一些特徵,去除噪聲和不重要的特徵,從而實現提高數據處理速度的目的。在實際的生產和應用中,降維在必定的信息損失範圍內,能夠爲咱們節省大量的時間和成本。降維也成爲應用很是普遍的數據預處理方法。bash
降維具備以下一些優勢:app
3.1 PCA的概念 PCA(Principal Component Analysis),即主成分分析方法,是一種使用最普遍的數據降維算法。PCA的主要思想是將n維特徵映射到k維上,這k維是全新的正交特徵也被稱爲主成分,是在原有n維特徵的基礎上從新構造出來的k維特徵。PCA的工做就是從原始的空間中順序地找一組相互正交的座標軸,新的座標軸的選擇與數據自己是密切相關的。其中,第一個新座標軸選擇是原始數據中方差最大的方向,第二個新座標軸選取是與第一個座標軸正交的平面中使得方差最大的,第三個軸是與第1,2個軸正交的平面中方差最大的。依次類推,能夠獲得n個這樣的座標軸。經過這種方式得到的新的座標軸,咱們發現,大部分方差都包含在前面k個座標軸中,後面的座標軸所含的方差幾乎爲0。因而,咱們能夠忽略餘下的座標軸,只保留前面k個含有絕大部分方差的座標軸。事實上,這至關於只保留包含絕大部分方差的維度特徵,而忽略包含方差幾乎爲0的特徵維度,實現對數據特徵的降維處理。機器學習
思考:咱們如何獲得這些包含最大差別性的主成分方向呢?源碼分析
答案:事實上,經過計算數據矩陣的協方差矩陣,而後獲得協方差矩陣的特徵值特徵向量,選擇特徵值最大(即方差最大)的k個特徵所對應的特徵向量組成的矩陣。這樣就能夠將數據矩陣轉換到新的空間當中,實現數據特徵的降維。學習
因爲獲得協方差矩陣的特徵值特徵向量有兩種方法:特徵值分解協方差矩陣、奇異值分解協方差矩陣,因此PCA算法有兩種實現方法:基於特徵值分解協方差矩陣實現PCA算法、基於SVD分解協方差矩陣實現PCA算法.
3.2 協方差和散度矩陣
樣本均值: 大數據
(1) 方差的計算公式是針對一維特徵,即針對同一特徵不一樣樣本的取值來進行計算獲得;而協方差則必需要求至少知足二維特徵;方差是協方差的特殊狀況。ui
(2) 方差和協方差的除數是n-1,這是爲了獲得方差和協方差的無偏估計。
協方差爲正時,說明X和Y是正相關關係;協方差爲負時,說明X和Y是負相關關係;協方差爲0時,說明X和Y是相互獨立。Cov(X,X)就是X的方差。當樣本是n維數據時,它們的協方差其實是協方差矩陣(對稱方陣)。例如,對於3維數據(x,y,z),計算它的協方差就是:
若是一個向量v是矩陣A的特徵向量,將必定能夠表示成下面的形式:
(2) 特徵值分解矩陣
對於矩陣A,有一組特徵向量v,將這組向量進行正交化單位化,就能獲得一組正交單位向量。特徵值分解,就是將矩陣A分解爲以下式:
奇異值分解是一個能適用於任意矩陣的一種分解的方法,對於任意矩陣A老是存在一個奇異值分解:
(1) 求的特徵值和特徵向量,用單位化的特徵向量構成 U。
(2) 求的特徵值和特徵向量,用單位化的特徵向量構成 V。
(3) 將或者的特徵值求平方根,而後構成 Σ。
3.5 PCA算法兩種實現方法
(1) 基於特徵值分解協方差矩陣實現PCA算法
輸入:數據集,須要降到k維。
去平均值(即去中心化),即每一位特徵減去各自的平均值。、
計算協方差矩陣,注:這裏除或不除樣本數量n或n-1,其實對求出的特徵向量沒有影響。
用特徵值分解方法求協方差矩陣的特徵值與特徵向量。
對特徵值從大到小排序,選擇其中最大的k個。而後將其對應的k個特徵向量分別做爲行向量組成特徵向量矩陣P。
將數據轉換到k個特徵向量構建的新空間中,即Y=PX。
總結:
1)關於這一部分爲何用,這裏面含有很複雜的線性代數理論推導,想了解具體細節的能夠看下面這篇文章。 CodingLabs - PCA的數學原理
2)關於爲何用特徵值分解矩陣,是由於是方陣,能很輕鬆的求出特徵值與特徵向量。固然,用奇異值分解也能夠,是求特徵值與特徵向量的另外一種方法。
舉個例子:
1)由於X矩陣的每行已是零均值,因此不須要去平均值。
2)求協方差矩陣:
求解後的特徵值爲:
對應的特徵向量爲: 其中對應的特徵向量分別是一個通解,和能夠取任意實數。那麼標準化後的特徵向量爲: 4)矩陣P爲: 5)最後咱們用P的第一行乘以數據矩陣X,就獲得了降維後的表示: 結果如圖1所示: 注意:若是咱們經過特徵值分解協方差矩陣,那麼咱們只能獲得一個方向的PCA降維。這個方向就是對數據矩陣X從行(或列)方向上壓縮降維。##Python實現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))
複製代碼
上面代碼實現了對數據X進行特徵的降維。結果以下:
(2)用sklearn的PCA與咱們的PCA作個比較:##用sklearn的PCA
from sklearn.decomposition import PCA
import numpy as np
X = np.array([[-1, 1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
pca=PCA(n_components=1)pca.fit(X)
print(pca.transform(X))
複製代碼
我在這裏只介紹最大方差理論:
所以咱們認爲,最好的k維特徵是將n維樣本點轉換爲k維後,每一維上的樣本方差都很大。
好比咱們將下圖中的5個點投影到某一維上,這裏用一條過原點的直線表示(數據已經中心化)
計算投影的方法見下圖:
圖中,紅色點表示樣例,藍色點表示在u上的投影,u是直線的斜率也是直線的方向向量,並且是單位向量。藍色點是在u上的投影點,離原點的距離是<x,u>(1) 主成分分析(PCA)原理詳解
http://blog.csdn.net/zhongkelee/article/details/44064401
(2) 機器學習之PCA主成分分析 - steed灬 - 博客園
https://www.cnblogs.com/steed/p/7454329.html
(3) 簡單易學的機器學習算法——主成分分析(PCA)
https://blog.csdn.net/google19890102/article/details/27969459
(4) 機器學習實戰之PCA - 笨鳥多學 - 博客園
https://www.cnblogs.com/zy230530/p/7074215.html
(5) 機器學習中的數學(5)-強大的矩陣奇異值分解(SVD)及其應用 - LeftNotEasy - 博客園
http://www.cnblogs.com/LeftNotEasy/archive/2011/01/19/svd-and-applications.html
(6) 從PCA和SVD的關係拾遺
https://blog.csdn.net/Dark_Scope/article/details/53150883
(7) CodingLabs - PCA的數學原理
http://blog.codinglabs.org/articles/pca-tutorial.html
(8) PCA(主成分分析)python實現
https://www.jianshu.com/p/4528aaa6dc48
(9) 主成分分析PCA(Principal Component Analysis)在sklearn中的應用及部分源碼分析