[Scikit-learn] 4.4 Dimensionality reduction - PCA

2.5. Decomposing signals in components (matrix factorization problems)php

  • 2.5.1. Principal component analysis (PCA)

4.4. Unsupervised dimensionality reductionhtml

  • 4.4.1. PCA: principal component analysis

 

PCA+ICA 解混过程:https://www.zhihu.com/question/28845451算法


1、PCA的理解

PCA是将n维特征映射到k维上(k<n),这k维特征是全新的正交特征,称为主元,app

是从新构造出来的k维特征,而不是简单的从n维特征中去除其他n-k维特征。dom

 

最大方差理论

From: https://www.zhihu.com/question/40043805/answer/138429562 函数

降维是动机, 最大方差理论是手段,然而最大方差理论自己又是什么?

既然牵涉到方差,天然联想到二乘法,即而天然联想到正态分布。
没错,PCA的基本假设是: 数据集的分布是一个n维正态分布,并由此对协方差矩阵进行贝叶斯估计(其中指望这一参数被中心化消去了)。

你能够尝试写出这个贝叶斯分析中的几率似然函数,在假定 协方差矩阵特征值必定的基础上,该似然函数的最大化形式就是PCA。
然而n维正态分布的协方差矩阵能不能被进一步简化呢?能够,一个天然而然简化矩阵的手段就是SVD。事实上对于一个n维正态分布的协方差矩阵做SVD和PCA是等价的。
不过PCA并不只仅是巧合般利用了SVD,
    • PCA的本质是对于一个以矩阵为参数的分布进行似然估计,
    • SVD是矩阵近似的有效手段,仅此而已。
      

 

 

2、PCA的数学原理 

Link: http://www.360doc.com/content/13/1124/02/9482_331688889.shtmlpost

"发明一遍PCA"url

(1). 基变换:旧坐标 --> 新坐标spa

单个坐标点3d

三个坐标点

 

(2). 基的数量若是小于向量自己的维度

有两行,表示两个字段。

中心化后以下。

坐标表示。

 

关键思想:降为一维后,但愿投影后的投影值尽可能的分散

    • 使用方差度量分散度。
    • 两个字段的协方差表示其相关性。

 

正对角线:两个字段的反差

反对角线: 协方差

 

 

3、举个栗子

简单例子

对该数据进行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 的内容,可进一步深刻。

 

 

4、主特征选择

Ref: 选择主成分个数

咱们该如何选择 \textstyle k ,即保留多少个PCA主成分?在上面这个简单的二维实验中,保留第一个成分看起来是天然的选择。对于高维数据来讲,作这个决定就没那么简单:若是 \textstyle k 过大,数据压缩率不高,在极限状况 \textstyle k=n 时,等因而在使用原始数据(只是旋转投射到了不一样的基);相反地,若是 \textstyle k 太小,那数据的近似偏差太太。

决定 \textstyle k 值时,咱们一般会考虑不一样 \textstyle k 值可保留的方差百分比

具体来讲,若是 \textstyle k=n ,那么咱们获得的是对数据的完美近似,也就是保留了100%的方差,即原始数据的全部变化都被保留下来;相反,若是 \textstyle k=0 ,那等因而使用零向量来逼近输入数据,也就是只有0%的方差被保留下来。

 

通常而言,设 \textstyle \lambda_1, \lambda_2, \ldots, \lambda_n 表示 \textstyle \Sigma 的特征值(按由大到小顺序排列),使得 \textstyle \lambda_j 为对应于特征向量 \textstyle u_j 的特征值。那么若是咱们保留前 \textstyle k 个成分,则保留的方差百分比可计算为:

\begin{align}
\frac{\sum_{j=1}^k \lambda_j}{\sum_{j=1}^n \lambda_j}.
\end{align}

在上面简单的二维实验中,\textstyle \lambda_1 = 7.29 ,\textstyle \lambda_2 = 0.69 。所以,若是保留 \textstyle k=1 个主成分,等于咱们保留了 \textstyle 7.29/(7.29+0.69) = 0.913 ,即91.3%的方差。

对保留方差的百分比进行更正式的定义已超出了本教程的范围,但很容易证实,\textstyle \lambda_j =
\sum_{i=1}^m x_{{\rm rot},j}^2 。所以,若是 \textstyle \lambda_j \approx 0 ,则说明 \textstyle x_{{\rm rot},j} 也就基本上接近于0,因此用0来近似它并不会产生多大损失。这也解释了为何要保留前面的主成分(对应的 \textstyle \lambda_j 值较大)而不是末尾的那些。 这些前面的主成分 \textstyle x_{{\rm rot},j} 变化性更大,取值也更大,若是将其设为0势必引入较大的近似偏差。

以处理图像数据为例,一个惯常的经验法则是选择 \textstyle k 以保留99%的方差,换句话说,咱们选取知足如下条件的最小 \textstyle k 值:

\begin{align}
\frac{\sum_{j=1}^k \lambda_j}{\sum_{j=1}^n \lambda_j} \geq 0.99. 
\end{align}

对其它应用,如不介意引入稍大的偏差,有时也保留90-98%的方差范围。若向他人介绍PCA算法详情,告诉他们你选择的 \textstyle k 保留了95%的方差,比告诉他们你保留了前120个(或任意某个数字)主成分更好理解。

 

 

5、Fisher Linear Discriminant Analysis (LDA)  

补充: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.

相关文章
相关标签/搜索