数据预处理之数据降维 PCA法

通常而言,在应用其他机器学习算法之前,需要首先对数据集进行简化,即降维处理,这可以解决以下问题:
1)解决大规模特征下的数据显示问题
2)使得数据集更易使用
3)降低后续算法的计算
4)消除噪声影响

5)使得结果更易理解


目前,有多种降维技术,包括主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)、奇异值分解(SVD)等,我们简单介绍几种降维方法的核心思想。
1)PCA
是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。核心在于PCA认为数据集中的主成分,即数据差异性大的维度,即方差大的维度,从而将多个原特征在此维度进行线性组合。具体实施是通过将原来数据的坐标系转换到新的坐标系,而这新的坐标系是由数据本身决定的。第一个新坐标轴选择原始数据中方差最大的方向,第二个新坐标轴选择和第一个坐标轴正交且方差最大的方向,重复进行此过程,重复的次数为原始数据中特征的数目。最后会发现新的坐标轴中,后面很多对应的最大方差都很小,即这些维度对区分数据差异作用很小,可以忽略,从而降低了数据维度。当然,后面可以看到实际编程中,我们通过特征值来观察差异性。
2)FA
通过假设数据是由一些观察不到的隐变量和某些噪声的线性组合,那么因变量的数目可能比观察数据的特征少,因此,找到这些隐变量就可以实现数据的降维。
3)ICA
通过假设数据是从M个数据源生成的,原始数据为多个数据源的混合观察结果,而这些数据源之间在统计上是相互独立的,因此,找到这些数据源就可以实现数据的降维。
4)SVD
属于矩阵分解技术之一,设原始数据集矩阵为T,由T=UAV^T,从有噪声的原始数据中抽取出相关特征,从而大大简化数据。

下面,我们着重介绍PCA法。
PCA实际计算主要包括两种方法,传统步骤为先求该矩阵的协方差矩阵,然后求出协方差矩阵的特征值和特征向量,此时用原数据乘以特征向量就可以实现降维了。另外一种方法就是通过奇异值分解进行求解,这也是Andrew Ng的教学视频求解方法。这两种方法本质上是一样的。



1、PCA流程


1)构造原始数据矩阵(mat):
假设原始数据集含n个特征,N个观测样本,从而可以构建N*n的原始数据集矩阵T
2)对T进行Z-mean归一化处理
得到N*n的Q
3)计算Q的协方差矩阵
得到n*n的P=cov(Q,rowvar=0)
4)计算P的特征值和特征向量
均为n个
5)将特征值从大到小排序
6)保留对应m个最大特征值的特征向量
构成n*m的特征空间矩阵R
7)将原始数据转换到新空间中
得到降维后的N*m数据矩阵X=T*R
8)用于新数据的处理
对新输入的1*n数据I,进行I*R得到降维后的1*m数据O,再进行后续学习


from numpy import *

def loadDataSet(fileName, delim='\t'):
	fr = open(fileName)
	stringArr = [line.strip().split(delim) for line in fr.readlines()]
	dataArr = [map(float,line) for line in stringArr]
	return mat(dataArr)
	
def pca(dataMat, topNfeat=99999):
	meanVals = mean(dataMat, axis=0)
	meanRemoved = dataMat - meanVals
	covMat = cov(meanRemoved,rowvar=0)
	eigVals,eigVects = linalg.eig(mat(covMat))
	eigValInd = argsort(eigVals)
	eigValInd = eigValInd[:-(topNfeat+1):-1]
	redEigVects = eigVects[:,eigValInd]
	lowDDataMat = meanRemoved * redEigVects
	reconMat = lowDDataMat*redEigVects.T + meanVals
	return lowDDataMat, reconMat



2、SVD应用

之前提到PCA过程中4-6其实也可以通过SVD实现,我们下面进行解释。

对于,对其进行SVD分解有,其中S是的特征向量矩阵,D是的特征向量矩阵,V是斜对角矩阵,每个元素即T的奇异值,是或者的特征值的非负平方根。

S,V,DT = linalg.svd(mat(T))

对T进行Z-mean归一化处理后,其协方差矩阵可以写作,可见矩阵D的每一列都是T的协方差矩阵的特征向量。

然后就可以得到降维后的处理数据。

但这样有个很大的问题,上面依赖对于T的SVD,计算空间和样本数N关系很大,当样本个数N非常大时,我们需要的存储空间是N×N+N×n+n×n将会非常大,因此,考虑下述方法。

1)对T进行均值归一化处理

2)先求出T的协方差矩阵

3)对sigma进行SVD,即S,V,DT = linalg.svd(mat(sigma))

4)可以证明这里的S也是sigma的特征向量,V为协方差的特征值(有个倍数关系)。

5)截留矩阵S中对应V中最大m个奇异值的特征向量(即列),得到特征空间矩阵R



3、PCA中主成分个数选择

一般,书上建议选择包含90% 信息量的主成分数量,即将特征值或者奇异值的大小的平方当做能量来看。

更一般的来,我们希望选出主成分之后,进行数据分析时,不会造成大量特征的丢失,也就是说可以用下式的error ratio表示经过压缩后的性能如何:

error ratio = 

然后,如果error ratio小于我们设定的threshold,说明这样选取主成分是可以接受的。

从数学上可以证明,上面这个error ratio 可以表示为

error ratio = 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值