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

参考

https://zhuanlan.zhihu.com/p/33191810

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertOS

还会有大爷会打钱?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值