2.5. Decomposing signals in components (matrix factorization problems)php
4.4. Unsupervised dimensionality reductionhtml
PCA+ICA 解混過程:https://www.zhihu.com/question/28845451算法
PCA是將n維特徵映射到k維上(k<n),這k維特徵是全新的正交特徵,稱爲主元,app
是從新構造出來的k維特徵,而不是簡單的從n維特徵中去除其他n-k維特徵。dom
From: https://www.zhihu.com/question/40043805/answer/138429562 函數
Link: http://www.360doc.com/content/13/1124/02/9482_331688889.shtmlpost
"發明一遍PCA"url
(1). 基變換:舊座標 --> 新座標spa
單個座標點3d
三個座標點
(2). 基的數量若是小於向量自己的維度
有兩行,表示兩個字段。
中心化後以下。
座標表示。
關鍵思想:降爲一維後,但願投影后的投影值儘可能的分散。
正對角線:兩個字段的反差
反對角線: 協方差
對該數據進行PCA降維。
Ref: Faces recognition example using eigenfaces and SVMs
一般就是pca + gmm or pca+svm的模式;降維後方便線性可分。
固然,主特徵最好是自然正交的!
# ############################################################################# # Split into a training set and a test set using a stratified k fold
# split into a training and testing set
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.25, random_state=42) # ############################################################################# # Compute a PCA (eigenfaces) on the face dataset (treated as unlabeled # dataset): unsupervised feature extraction / dimensionality reduction
n_components = 150
print("Extracting the top %d eigenfaces from %d faces"
% (n_components, X_train.shape[0])) t0 = time() pca = PCA(n_components=n_components, svd_solver='randomized', whiten=True).fit(X_train) print("done in %0.3fs" % (time() - t0)) eigenfaces =pca.components_.reshape((n_components, h, w)) print("Projecting the input data on the eigenfaces orthonormal basis") t0 = time() X_train_pca = pca.transform(X_train) X_test_pca = pca.transform(X_test) print("done in %0.3fs" % (time() - t0)) # Jeff
print(pca.components_.shape) print(eigenfaces.shape)
以下可見,協方差矩陣只有前150行被採用,做爲了主特徵。
pca.components_
類型:array,[n_components,n_features]
意義:特徵空間中的主軸,表示數據中最大方差的方向。按explain_variance_排序。
Extracting the top 150 eigenfaces from 912 faces done in 0.228s Projecting the input data on the eigenfaces orthonormal basis done in 0.024s (150, 1850) (150, 50, 37)
這些恐怖頭像表示什麼意思?
def plot_gallery(images, titles, h, w, n_row=3, n_col=4): """Helper function to plot a gallery of portraits"""
plt.figure(figsize=(1.8 * n_col, 2.4 * n_row)) plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35)
for i in range(n_row * n_col): plt.subplot(n_row, n_col, i + 1) plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray) plt.title(titles[i], size=12) plt.xticks(()) plt.yticks(())
4.4.1. PCA: principal component analysis 的內容,可進一步深刻。
Ref: 選擇主成分個數
咱們該如何選擇 ,即保留多少個PCA主成分?在上面這個簡單的二維實驗中,保留第一個成分看起來是天然的選擇。對於高維數據來講,作這個決定就沒那麼簡單:若是
過大,數據壓縮率不高,在極限狀況
時,等因而在使用原始數據(只是旋轉投射到了不一樣的基);相反地,若是
太小,那數據的近似偏差太太。
決定 值時,咱們一般會考慮不一樣
值可保留的方差百分比。
具體來講,若是 ,那麼咱們獲得的是對數據的完美近似,也就是保留了100%的方差,即原始數據的全部變化都被保留下來;相反,若是
,那等因而使用零向量來逼近輸入數據,也就是隻有0%的方差被保留下來。
通常而言,設 表示
的特徵值(按由大到小順序排列),使得
爲對應於特徵向量
的特徵值。那麼若是咱們保留前
個成分,則保留的方差百分比可計算爲:
在上面簡單的二維實驗中, ,
。所以,若是保留
個主成分,等於咱們保留了
,即91.3%的方差。
對保留方差的百分比進行更正式的定義已超出了本教程的範圍,但很容易證實, 。所以,若是
,則說明
也就基本上接近於0,因此用0來近似它並不會產生多大損失。這也解釋了爲何要保留前面的主成分(對應的
值較大)而不是末尾的那些。 這些前面的主成分
變化性更大,取值也更大,若是將其設爲0勢必引入較大的近似偏差。
以處理圖像數據爲例,一個慣常的經驗法則是選擇 以保留99%的方差,換句話說,咱們選取知足如下條件的最小
值:
對其它應用,如不介意引入稍大的偏差,有時也保留90-98%的方差範圍。若向他人介紹PCA算法詳情,告訴他們你選擇的 保留了95%的方差,比告訴他們你保留了前120個(或任意某個數字)主成分更好理解。
補充:from http://blog.pluskid.org/?p=290
區分不一樣類別:[Scikit-learn] 1.2 Dimensionality reduction - Linear and Quadratic Discriminant Analysis
雖然 PCA 極力下降 reconstruction error ,試圖獲得能夠表明原始數據的 components ,可是卻沒法保證這些 components 是有助於區分不一樣類別的。若是咱們有訓練數據的類別標籤,則能夠用 Fisher Linear Discriminant Analysis 來處理這個問題。
同 PCA 同樣,Fisher Linear Discriminant Analysis 也是一個線性映射模型,只不過它的目標函數並非 Variance 最大化,而是有針對性地使投影以後:
(1) 屬於同一個類別的數據之間的 variance 最小化,
(2) 屬於不一樣類別的數據之間的 variance 最大化。
具體的形式和推導能夠參見《Pattern Classification》這本書的第三章 Component Analysis and Discriminants。
固然,不少時候(好比作聚類)咱們並不知道原始數據是屬於哪一個類別的,此時 Linear Discriminant Analysis 就沒有辦法了。不過,若是咱們假設原始的數據形式就是可區分的的話,則能夠經過保持這種可區分度的方式來作降維。
MDS 是 PCA 以外的另外一種經典的降維方法,它降維的限制就是要保持數據之間的相對距離。實際上 MDS 甚至不要求原始數據是處在一個何種空間中的,只要給出他們之間的相對「距離」,它就能夠將其映射到一個低維歐氏空間中,一般是三維或者二維,用於作 visualization 。
End.