数据的降维处理(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)
中间那一部分就是样本特征的协方差矩阵。
λ就是Σ的特征值,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