11.1 PCA的基本概念

  • 主成分分析(Principal component analysis, PCA)是一种常见的无监督学习方式,利用正交变换把线性相关变量表示的观测数据转换成几个线性无关变量所表示的数据。
    • 这些线性无关的变量就叫做主成分
    • 主成分分析是一种降维的方法
    • 《统计学习方法》中一书中举了很多种例子
  • 在数据总体上进行的主成分分析叫做总体主成分分析,在有限的样本数据上进行的主成分分析称为样本主成分分析

11.2 样本主成分分析

  • 问题的情景:对m维的随机变量x进行n次独立的观测,得到一个大小为十一、主成分分析PCA - 图1的样本矩阵十一、主成分分析PCA - 图2,并且可以估计这些样本的均值向量:

十一、主成分分析PCA - 图3

11.2.1样本的统计量

  • 对于上面的样本,协方差矩阵十一、主成分分析PCA - 图4,其中

十一、主成分分析PCA - 图5(x%7Bjk%7D-%5Cbar%20x_j)%0A#card=math&code=s%7Bij%7D%3D%5Cfrac%201%7Bn-1%7D%5Csum%7Bk%3D1%7D%5En%28x%7Bik%7D-%5Cbar%20xi%29%28x%7Bjk%7D-%5Cbar%20x_j%29%0A)

  • 样本的相关矩阵十一、主成分分析PCA - 图6可以写作:

十一、主成分分析PCA - 图7

11.2.2 主成分的定义

  • 我们可以设一个m维的随机变量x到m维的随机变量y的一个线性变换:

十一、主成分分析PCA - 图8%3DA%5ETx%3D%5Csum%7Bi%3D1%7D%5Em%5Calpha_ix_i%0A#card=math&code=%5Cmathcal%20Y%3D%28y_1%2Cy_2%2C%5Cdots%2Cy_m%29%3DA%5ETx%3D%5Csum%7Bi%3D1%7D%5Em%5Calpha_ix_i%0A)

十一、主成分分析PCA - 图9

11.2.3 主成分的统计量

  • 对于随机变量十一、主成分分析PCA - 图10#card=math&code=%5Cmathcal%20Y%3D%28y_1%2Cy_2%2C%5Cdots%2Cy_m%29),其统计量有:

十一、主成分分析PCA - 图11%3D%5Calphai%5ET%20S%5Calpha_i%20%5C%5C%20%5Cmathrm%7Bcov%7D(y_i%2Cy_j)%3D%5Calpha_i%5ET%20S%5Calpha_j%0A#card=math&code=%5Cbar%20y_i%3D%5Cfrac%201n%5Csum%7Bj%3D1%7D%5En%5Calpha_i%5ETx_j%3D%5Calpha_i%20%5Cbar%20x%20%5C%5C%20%5Cmathrm%7Bvar%7D%28y_i%29%3D%5Calpha_i%5ET%20S%5Calpha_i%20%5C%5C%20%5Cmathrm%7Bcov%7D%28y_i%2Cy_j%29%3D%5Calpha_i%5ET%20S%5Calpha_j%0A)

11.2.4 PCA的算法

  • 先将样本矩阵进行normalization:

十一、主成分分析PCA - 图12

  • 计算样本的协方差矩阵十一、主成分分析PCA - 图13并对其进行特征值的分解
  • 取最大的d个特征值所对应的特征向量十一、主成分分析PCA - 图14
  • 输出投影矩阵十一、主成分分析PCA - 图15#card=math&code=W%5E%2A%3D%28w_1%2Cw_2%2C%5Cdots%2Cw_d%29)

11.3 PCA算法的实现

  1. def PCA(data):
  2. """
  3. PCA Principal Component Analysis
  4. Input:
  5. data - Data numpy array. Each row vector of fea is a data point.
  6. Output:
  7. eigvector - Each column is an embedding function, for a new
  8. data point (row vector) x, y = x*eigvector
  9. will be the embedding result of x.
  10. eigvalue - The sorted eigvalue of PCA eigen-problem.
  11. """
  12. # Hint: you may need to **normalize** the data before applying PCA
  13. # begin answer
  14. p, N = data.shape
  15. normal_data = data - np.average(data, axis=1).reshape(p, 1)
  16. conv = np.matmul(normal_data, normal_data.T) / N
  17. eigen_values, eigen_vectors = np.linalg.eig(conv)
  18. index = np.argsort(eigen_values)[:: -1]
  19. eigen_values = eigen_values[index]
  20. eigen_vectors = eigen_vectors[:, index]
  21. # end answer
  22. return eigen_vectors, eigen_values