PCA降维—原理简述及代码实现

PCA降维—知识点简述及代码实现

  • 应用数据
  • 降维的目的
  • 特征值分析
  • PCA的工作原理
  • 代码实现

应用数据

PCA降维适用于特征属性为连续数值型数据,目标变量为标称型数据的数据集,例如下面的西瓜数据集:

密度 含糖量 是否好瓜
1 0.697 0.460
2 0.774 0.376
3 0.634 0.264
4 0.608 0.318
5 0.556 0.215

注: 当然这里是假设西瓜“是否好瓜”仅受这两个因素的影响,真实情况下西瓜数据集不适用于此,因为西瓜数据集中还有许多标称型属性。

降维的目的

降维工作是在数据预处理的时候进行的,目的是为了使分类问题变得更加容易处理,提高后续建立分类模型的效率,同时降低成本。

假设现有两个数据集:
PCA降维—原理简述及代码实现_第1张图片
PCA降维—原理简述及代码实现_第2张图片
对图一,是一个二维空间下的分类任务,我们只需要找到一条最佳的拟合直线,就可以将红类别与蓝类别很好的划分开;而对图二,我们则需要找到一个最佳的划分平面,才能将其很好地分类。

如果数据集的维数继续上升,变为N维数据,那么分类器的建立将会变得非常困难。比如半导体数据集,数据集中拥有590个连续数值型特征,这时候如果想要用决策树算法对半导体数据集进行训练,难道要进行几百次的分支吗,这样做显然开销巨大,因此需要对其进行降维处理。

特征值分析

假设现有特征矩阵A,n维非零向量v,和实数λ,且它们满足下式:
在这里插入图片描述
则称数λ为矩阵A的 特征值 ,非零向量v为矩阵A对应于特征值λ的 特征向量

PCA的工作原理

PCA降维方法称为 主成成分分析 ,是目前降维技术中应用得最广泛的,此外还有两个常用的降维技术分别是:因子分析、独立成分分析。

PCA工作的过程就是在高维的数据分布空间中,先拟定第一条新的新的坐标轴,并将其旋转到覆盖数据的最大方差位置,即图中的直线B, 数据的最大方差给出了数据的最重要的信息。然后选择覆盖数据次大差异性,且与第一条坐标轴垂直的坐标轴,将其作为第二条新坐标轴。这样依次进行,最后构成新的空间(低维空间)。
PCA降维—原理简述及代码实现_第3张图片
上述寻找坐标轴的过程,实际上就是在依次寻找最大特征值对应的特征向量(且相互正交),也就是依次寻找符合条件的主成成分。

而寻找最大特征值只需要先得到特征矩阵的协方差矩阵,计算出协方差矩阵的特征值和特征向量,并将特征值从大到小排序,然后就可以得到对应的特征向量(即主成成分)了。

最后PCA将原始数据从原始的高维空间转化到这些特征向量所构成的新坐标系内,实现对数据集特征矩阵的降维。

PCA算法中将数据转换为前N个主成成分的伪代码如下:

去除平均值
计算协方差矩阵 
计算协方差矩阵的特征值和特征向量
将特征值从大到小排序
保留最上面的N个特征向量
将数据转换到上述N个特征向量构建的新空间中

代码实现

PCA算法

from numpy import *

def loadDataSet(fileName, delim=1\t 1): #下载数据集
 	fr = open(fileName)
	stringArr = [line.strip().split(delim) for line in f r .readlines()] 
	datArr = [map(float,line) for line in stringArr] 
	return m a t (datArr)

def p c a (dataMat, topNfeat=20):
	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+l)-1] #逆序并取前N
	#取出topNfeat个最大的特征值对应的特征向量,构成用来对数据进行转换的矩阵
	redEigVects = eigVects{,eigValInd]
	lowDDataMat = meanRemoved * redEigVects #用该矩阵将原始数据转换到新空间
	reconMat = (lowDDataMat * redEigVects.T) + meanVals #降维后的数据集
	return lowDDataMat, reconMat #最后返回转换到新空间中的数据,和降维后的数据集

你可能感兴趣的:(机器学习)