当前位置:   article > 正文

PCA算法_pca降维后如何重构回原来的维度

pca降维后如何重构回原来的维度

定义

 PCA(Principal Components Analysis)即主成分分析,是一种常用的数据分析手段,是图像处理中经常用到的降维方法。对于一组不同维度之间可能存在线性相关关系的数据,PCA能够把这组数据通过正交变换变成各个维度之间线性无关的数据,经过PCA处理的数据中的各个样本之间的关系往往更直观,所以它是一种非常常用的数据分析和预处理工具。PCA处理之后的数据各个维度之间是线性无关的,通过剔除方差较小的那些维度上的数据,我们可以达到数据降维的目的。

基本思想

 

 PCA数学基础

1. 协方差定义

X、Y 是两个随机变量,X、Y 的协方差 cov(X, Y) 定义为:

 

其中:

 

2. 协方差矩阵定义

矩阵中的数据按行排列与按列排列求出的协方差矩阵是不同的,这里默认数据是按行排列。即每一行是一个observation(or sample),那么每一列就是一个随机变量。

协方差矩阵:

协方差矩阵的维度等于随机变量的个数,即每一个 observation 的维度。在某些场合前边也会出现 1 / m,而不是 1 / (m - 1).

3. 求解协方差矩阵的步骤

举个例子,矩阵 X 按行排列:

①求每个维度的平均值

 

②将 X 的每一列减去平均值

 其中:

 

③计算协方差矩阵

注意:

有时候在书上或者网上会看到这样的公式,协方差矩阵 Σ:

这里之所以会是 X * X' 是因为原始数据集 X 是按列排列的,即:

 PAC算法流程

 

PAC实例 

下面举一个简单的例子,说明PCA的过程。

假设我们的数据集有10个二维数据,

  1. (2.5,2.4), (0.5,0.7), (2.2,2.9),
  2. (1.9,2.2), (3.1,3.0), (2.3, 2.7),
  3. (2, 1.6), (1, 1.1), (1.5, 1.6), (1.1, 0.9)

需要用PCA降到1维特征。

首先我们对样本中心化,这里样本的均值为(1.81, 1.91),所有的样本减去这个均值向量后,即中心化后的数据集为

  1. (0.69, 0.49), (-1.31, -1.21), (0.39, 0.99),
  2. (0.09, 0.29), (1.29, 1.09), (0.49, 0.79),
  3. (0.19, -0.31), (-0.81, -0.81), (-0.31, -0.31),
  4. (-0.71, -1.01)

现在我们开始求样本的协方差矩阵,由于我们是二维的,则协方差矩阵为:

对于我们的数据,求出协方差矩阵为:

 

求出特征值为:

0.04908339891.28402771),

对应的特征向量分别为:
 

由于最大的 k=1 个特征值为1.28402771,
对应于的 k=1个特征向量为

 

则我们的W为

 

我们对所有的数据集进行投影 ,得到PCA降维后的10个一维数据集为:

  1. (-0.827970186, 1.77758033, -0.992197494,
  2. -0.274210416, -1.67580142, -0.912949103,
  3. 0.0991094375, 1.14457216, 0.438046137,
  4. 1.22382056)

到此已经完成了降维。

PCA代码实现

  1. # coding:utf-8
  2. import numpy as np
  3. from sklearn.datasets import load_iris
  4. from sklearn.decomposition import PCA
  5. import matplotlib.pyplot as plt
  6. def pca(data, n_components):
  7. '''
  8. pca is O(D^3)
  9. :param data: (n_samples, n_features(D))
  10. :param n_dim: target dimensions
  11. :return: (n_samples, n_components)
  12. '''
  13. # 减去均值,也可以进行标准化处理(除以方差)
  14. data = data - np.mean(data, axis = 0, keepdims = True)
  15. # 计算协方差矩阵
  16. cov_matrix = 1/len(data) * np.matmul(data.T, data)
  17. # 计算协方差矩阵特征值及对应的特征向量
  18. eig_values, eig_vector = np.linalg.eig(cov_matrix)
  19. # print(eig_values)
  20. # 对特征值进行排序,并取前n_components组
  21. indexs_ = np.argsort(-eig_values)[:n_components]
  22. picked_eig_values = eig_values[indexs_]
  23. picked_eig_vector = eig_vector[:, indexs_]
  24. data_ndim = np.matmul(data, picked_eig_vector)
  25. return data_ndim
  26. # data 降维的矩阵(n_samples, n_features)
  27. # n_dim 目标维度
  28. # fit n_features >> n_samples, reduce cal
  29. if __name__ == "__main__":
  30. data = load_iris()
  31. X = data.data
  32. Y = data.target
  33. data_2d1 = pca(X, 2)
  34. plt.figure(figsize=(8,4))
  35. plt.subplot(121)
  36. plt.title("my_PCA")
  37. plt.scatter(data_2d1[:, 0], data_2d1[:, 1], c = Y)
  38. sklearn_pca = PCA(n_components=2)
  39. data_2d2 = sklearn_pca.fit_transform(X)
  40. plt.subplot(122)
  41. plt.title("sklearn_PCA")
  42. plt.scatter(data_2d2[:, 0], data_2d2[:, 1], c = Y)
  43. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/304180?site
推荐阅读
相关标签
  

闽ICP备14008679号