PCA算法的学习

引入

主成分分析(Principal components analysis,简称PCA)是最重要的降维方法之一。在数据压缩消除冗余和数据噪音消除等领域都有广泛的应用。一般我们提到降维最容易想到的算法就是PCA。 PCA算法主要用于(1)高维数据集的探索与可视化。2)数据压缩。3)数据预处理。4)图象、语音、通信的分析处理。5)降维(最主要),去除数据冗余与噪声。

1 PCA的思想

PCA顾名思义,就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据。具体的,假如我们的数据集是n维的,共有m个数据。 我们希望将这m个数据的维度从n维降到n'维,希望这m个n'维的数据集尽可能的代表原始数据集。我们知道数据从n维降到n'维肯定会有损失,但是我们希望损失尽可能的小。那么如何让这n'维的数据尽可能表示原来的数据呢?

PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同正交方向上没有相关性。数据从原来的坐标系转换到新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行降维处理。 在这里插入图片描述 在这里插入图片描述在这里插入图片描述

2 PCA的算法流程

  1. 去平均值,即每一位特征减去各自的平均值;
  2. 计算协方差矩阵;
  3. 计算协方差矩阵的特征值与特征向量;
  4. 对特征值从大到小排序;
  5. 保留最大的个特征向量;
  6. 将数据转换到个特征向量构建的新空间中。

3 PCA算法实现一般流程:     

  1. 对数据进行归一化处理;
  2. 计算归一化后的数据集的协方差矩阵;
  3. 计算协方差矩阵的特征值和特征向量;
  4. 保留最重要的k个特征(通常k要小于n);
  5. 找出k个特征值相应的特征向量
  6. 将m * n的数据集乘以k个n维的特征向量的特征向量(n * k),得到最后降维的数据。

PCA降维准则:

  1. 最近重构性:样本集中所有点,重构后的点距离原来的点的误差之和最小。
  2. 最大可分性:样本在低维空间的投影尽可能分开。

PCA算法优点:

  1. 使得数据集更易使用;
  2. 降低算法的计算开销;
  3. 去除噪声;
  4. 使得结果容易理解;
  5. 完全无参数限制。

PCA算法缺点:

  1. 如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高;
  2. 特征值分解有一些局限性,比如变换的矩阵必须是方阵;
  3. 在非高斯分布情况下,PCA方法得出的主元可能并不是最优的。

算法核心

# 定义PCA算法
def PCA(data, r):
    data = np.float32(np.mat(data))
    rows, cols = np.shape(data)
    data_mean = np.mean(data, 0)  # 对列求平均值
    A = data - np.tile(data_mean, (rows, 1))  # 将所有样例减去对应均值得到A
    C = A * A.T  # 得到协方差矩阵
    D, V = np.linalg.eig(C)  # 求协方差矩阵的特征值和特征向量
    V_r = V[:, 0:r]  # 按列取前r个特征向量
    V_r = A.T * V_r  # 小矩阵特征向量向大矩阵特征向量过渡
    for i in range(r):
        V_r[:, i] = V_r[:, i] / np.linalg.norm(V_r[:, i])  # 特征向量归一化

    final_data = A * V_r
    return final_data, data_mean, V_r
复制代码

参考

zhuanlan.zhihu.com/p/33191810

猜你喜欢

转载自juejin.im/post/7078504048038527012