PCA原理分析及实现

PCA即主成分分析,是用一个超平面对所有样本进行恰当表达的方法,思想是将n维特征映射到k维上(k

一、概念解释

这里引用了两篇博文,由于一直做独立收藏,无法找到原作者,故仅提供云笔记链接:主成分分析(PCA) 。该文章写得清晰明了,这里也就不过多说明,到算法实现时再详细介绍求解步骤。

二、算法实现

算法目的:将N维特征转化为K维特征。拿到多维数据之后算法步骤如下(为了说明算法使用下面简单的数据):

特征A 特征B
1 1
1.1 3
0.9 5

1. 首先对数据的每项特征做取均值化处理 

\bar{A} = \frac{1}{3}\sum (1 + 1.1 + 0.9) = 1

\bar{B} = \frac{1}{3}\sum (1 + 3 + 5) = 3

故所得

特征A 特征B
0 -2
0.1 0
-0.1 2

2. 求特征的协方差矩阵

协方差的求法如下:

PCA原理分析及实现_第1张图片

对多维随机变量\(\textbf X=[X_1, X_2, X_3, ..., X_n]^T\),我们往往需要计算各维度两两之间的协方差,这样各协方差组成了一个\(n\times n\)的矩阵,称为协方差矩阵。协方差矩阵是个对称矩阵,对角线上的元素是各维度上随机变量的方差。我们定义协方差矩阵为\Sigma,这个符号与求和\sum相同,需要根据上下文区分。矩阵内的元素\(\Sigma_{ij}\)

                                                                                      \small {\centering \Sigma=\operatorname{E}\big[(\textbf X-\operatorname{E}[\textbf X]\big)(\textbf X-\operatorname{E}[\textbf X])^T}

这个矩阵为

                                                                             \small \begin{bmatrix} \operatorname{cov}(X_1, X_1) \operatorname{cov}(X_1, X_2) \cdots \operatorname{cov}(X_1, X_n) \\ \operatorname{cov}(X_2, X_1) \operatorname{cov}(X_2, X_2) \cdots \operatorname{cov}(X_2, X_n) \\ \vdots \vdots \ddots \vdots \\ \operatorname{cov}(X_n, X_1) \operatorname{cov}(X_n, X_2) \cdots \operatorname{cov}(X_n, X_n) \end{bmatrix}

故所得

                                                                                          \small \small \begin{bmatrix} 0.02 & -0.2\\ -0.2 & 8 \end{bmatrix}

3. 求该协方差矩阵的特征值和特征向量

我们使用numpy来计算矩阵的特征值和特征向量:

import numpy as np

a = np.array([[0.02, -0.2],[-0.2, 8]])

b = np.linalg.eig(a)

其中b[0]保存的是矩阵a的特征值,b[1]保存的是矩阵的特征向量​​​​​​​

[0.01499061 8.00500939]

[[-0.99968647  0.02503908]

[-0.02503908 -0.99968647]]

4. 求前K个最大的特征值,将其对应的特征向量组成新的矩阵

在本例中最大的特征值为8,对应的特征向量为[-0.02503908 -0.99968647]

5. 将样本点投影到选取的特征向量上

将原本去均值化的特征矩阵乘上由特征向量(按列组合)组成的矩阵,就可得到最终的结果:

                                  \small \begin{bmatrix} 0 & -2\\ 0.1 & 0 \\ -0.1 & 2 \end{bmatrix}\times \begin{bmatrix} -0.02503908 \\-0.99968647 \end{bmatrix} = \begin{bmatrix} 2\\ -0.0025 \\-1.9975 \end{bmatrix}

这样,就将原始样例的n维特征变成了k维,这k维就是原始特征在k维上的投影。该特征基本上代表了这两个特征。

三、使用sklearn库来实现PCA

利用上面的例子,我们实现用sklearn来实现PCA,代码如下:

import numpy as np

from sklearn.decomposition import PCA

X = np.array([[1, 1], [1.1, 3], [0.9, 5]])

pca = PCA(n_components=1)

pca.fit(X)

print(pca.transform(X))

需要注意的地方: 

  • PCA对象属性 
    components_:返回具有最大方差的成分。 
    explained_variance_ratio_:返回 所保留的n个成分各自的方差百分比。 
    n_components_:返回所保留的成分个数n。
  • fit(X,y=None) 
    fit()可以说是scikit-learn中通用的方法,每个需要训练的算法都会有fit()方法,它其实就是算法中的“训练”这一步骤。因为PCA是无监督学习算法,此处y自然等于None。 
    fit(X),表示用数据X来训练PCA模型。函数返回值:调用fit方法的对象本身。比如pca.fit(X),表示用X对pca这个对象进行训练。 
    fit_transform(X) 
    用X来训练PCA模型,同时返回降维后的数据。 
    newX=pca.fit_transform(X),newX就是降维后的数据。 
    inverse_transform() 
    将降维后的数据转换成原始数据,X=pca.inverse_transform(newX) 
    transform(X) 
    将数据X转换成降维后的数据。当模型训练好后,对于新输入的数据,都可以用transform方法来降维。

参考网址:

https://blog.csdn.net/happyxghero/article/details/92846614

你可能感兴趣的:(算法,机器学习,人工智能)