PCA(主成份分析法)技术及其Python实现

数据的降维处理(Dimensionality Reduction)

在现实中,经常出现数据量很大很高维的情况,那这样以来就很难处理数据。若可以对数据进行降维处理,那么我们的数据就可以变得简单,数据集会变得更易用,又可以降低算法的计算开销,与此同时可以去除噪声,使得结果更易懂。降低数据的维数其实主要有两种作用:压缩数据,减小硬盘存储量;便于实现数据可视化。Andrew老师的课程中说了,降低数据的维数并不一定可以用来控制overfitting。

对于未的标注数据,我们有一种方法叫做主成份分析法,也就是PCA(Principle Component analysis),还有因子分析(Factor Analysis),独立成分分析(Independent component analysis)等,本文主要介绍这种PCA的方法。另外几种方法将在后续博文中介绍。


主成份分析法(PCA)

1. PCA目标说明
引用Andrew老师的例子,若需要将一个二维的数据变为一维的数据,那我们就需要将找到一个向量,将其他所有点都投影到这个点上,获取一个新的值,也就是下面的Z1变量。

这里写图片描述

对于一个需要从从n-Dimension降到k-Dimension的问题,我们所需要做的就是:找到K个投影向量使得投影误差最小。那么其实PCA算法的目标就简化成两个明确的问题了:

  • 如何确定投影向量;
  • 如何计算投影后的值;

2.PCA算法步骤说明

  • 计算协方差矩阵
    这里写图片描述
  • 计算协方差矩阵的特征向量
    这里写图片描述
  • 选出最佳的k个特征向量进行排序
    这里写图片描述
  • 计算降维之后的值
    这里写图片描述

那为什么协方差矩阵的特征向量就可以代表最佳的几个投影结果,就能说明所产生的误差是最小的呢?

在JerryLead的博客中曾经看到过分析,他的理解是可以按照三种方式来解释:最大方差理论、最小错误理论和座标轴相关度理论。在Andrew老师的讲义里使用的就是最大方差理论方法来分析。

先看投影(下面一部分摘自JerryLead 的读书笔记) :

这里写图片描述

红色点表示样例 x(i) ,蓝色点表示 x(i) 在 u 上的投影,u 是直线的斜率也是直线的方向向量,而且是单位向量。蓝色点是 x(i) 在 u 上的投影点,离原点的距离是 <x(i),u> <script id="MathJax-Element-4" type="math/tex"> </script> ,(即 x(i)TU 或者 uTx(i) )由于这些样本点(样例)的每一维特征均值都为 0,因此投影到 u 上的样本点(只有一个到原点的距离值)的均值仍然是 0。 回到上面左右图中的左图,我们要求的是最佳的 u,使得投影后的样本点方差最大。

这里写图片描述
中间那一部分就是样本特征的协方差矩阵。
这里写图片描述

λ就是Σ的特征值,u 是特征向量。最佳的投影直线是特征值λ最大时对应的特征向量,其次是λ第二大对应的特征向量,依次类推。

因此,我们只需要对协方差矩阵进行特征值分解,得到的前 k 大特征值对应的特征向量
就是最佳的 k 维新特征,而且这 k 维新特征是正交的。得到前 k 个 u 以后,样例 x(i) 通过以下变换可以得到新的样本。
这里写图片描述


在知道了理论推导过程之后,还有一个问题没有解决,就是如何选择 k <script id="MathJax-Element-8" type="math/tex">k</script>!

这里写图片描述
或者换个简单的表示方法就成了:
这里写图片描述

上述就是整个PCA的理论推导过程~


4.PCA的代码实现

#! /usr/lib/bin python
# -*-coding:utf-8 -*-

from numpy import *

def pca(dataMat, topNfeat=99):
    # 先对数据进行预处理
    meanValue = mean(dataMat, axis=0)
    meanRemoved = dataMat - meanValue
    # 计算协方差矩阵
    covMat = conv(meanRemoved, rowvar=0)
    # 计算特征值和特征向量
    eigvals,eigVects = linalg.eig(mat(covMat))
    # 对特征值进行排序
    eigSort = argsort(eigVals)
    eigValid = eigSort[:-(topNfeat+1):-1]
    redEigVecs = eigVects[:,eigValid]
    # 计算最后转换后的矩阵
    lowDataMat = meanRemoved * redEigVecs
    reconMat = (lowDataMat * redEigVec.T) + meanValue
    return lowDataMat, reconMat
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值