机器学习实战笔记-利用PCA来简化数据

本篇文章不涉及理论推理。如果你想知道为什么通过协方差矩阵算出特征向量和特征值,然后对特征值进行排序后找到对应的特征向量与原矩阵X相乘即可得到降维后的X,可以去看看这篇文章:
http://blog.csdn.net/sinat_17451213/article/details/51193720
里面包含了如何通过基(对应特征向量)来对向量降维,如何通过原始数据集的协方差矩阵来得到特征值和特征向量使特征向量乘以原始矩阵得到的变换后的数据集的协方差矩阵满足使各个字段方差尽可能小并且使字段间线性无关。

13.1 降维技术

对数据进行简化有如下一系列的原因:
使得数据集更易使用;
降低很多算法的计算开销;
去除噪声;
使得结果易懂。

在已标注与未标注的数据上都有降维技术。这里我们将主要关注未标注数据上的降维技术,该技术同时也可以应用于已标注的数据。
第一种降维的方法称为主成分分析(Principal Component Analysis,PCA)。在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理。

另外一种降维技术是因子分析(Factor Analysis)。在因子分析中,我们假设在观察数据的生成中有一些观察不到的隐变量(latent variable)。假设观察数据是这些隐变量和某些噪声的线性组合。那么隐变量的数据可能比观察数据的数目少,也就是说通过找到隐变量就可以实现数据的降维。因子分析已经应用于社会科学、金融和其他领域中了。

还有一种降维技术就是独立成分分析(Independent Component Analysis,ICA )。ICA假设数据是从N个数据源生成的,这一点和因子分析有些类似。假设数据为多个数据源的混合观察结果,这些数据源之间在统计上是相互独立的,而在PCA中只假设数据是不相关的。同因子分析一样,如果数据源的数目少于观察数据的数目,则可以实现降维过程。

13.2 PCA

主成分分析
优点:降低数据的复杂性,识别最重要的多个特征。
缺点:不一定需要, 且可能损失有用信息。
适用数据类型:数值型数据。

13.2.1移动坐标轴

考虑一下图13-1中的大量数据点。如果要求我们画出一条直线,这条线要尽可能覆盖这些点,那么最长的线可能是哪条?我做过多次尝试。在图13-1中,3条直线中B最长。在PCA中 ,我们对数据的坐标进行了旋转,该旋转的过程取决于数据的本身。第一条坐标轴旋转到覆盖数据的最大方差位置,即图中的直线B。数据的最大方差给出了数据的最重要的信息。

在选择了覆盖数据最大差异性的坐标轴之后,我们选择了第二条坐标轴。假如该坐标轴与第一条坐标轴垂直,它就是覆盖数据次大差异性的坐标轴。这里更严谨的说法就是正交(orthogonal)。当然,在二维平面下,垂直和正交是一回事。在图13-1中,直线C就是第二条坐标轴。利用PCA,我们将数据坐标轴旋转至数据角度上的那些最重要的方向。(这里提到的数据差异性其实指的就是一个特征的方差,正交是指特征之间无线性相关性)
这里写图片描述

通过PCA进行降维处理,我们就可以同时获得SVM和决策树的优点:一方面,得到了和决策树一样简单的分类器,同时分类间隔和SVM — 样好。考察图13-2中下面的图,其中的数据来自于上面的图并经PCA转换之后绘制而成的。如果仅使用原始数据,那么这里的间隔会比决策树的间隔更大。另外,由于只需要考虑一维信息,因此数据就可以通过比SVM简单得多的很容易采用的规则进行区分。
这里写图片描述

在图13-2中,我们只需要一维信息即可,因为另一维信息只是对分类缺乏贡献的噪声数据。在二维平面下,这一点看上去微不足道,但是如果在高维空间下则意义重大。
我们已经对PCA的基本过程做出了简单的阐述,接下来就可以通过代码来实PCA过程。前面我曾提到的第一个主成分就是从数据差异性最大(即方差最大)的方向提取出来的,第二个主成分则来自于数据差异性次大的方向,并且该方向与第一个主成分方向正交。通过数据集的协方差矩阵及其特征值分析,我们就可以求得这些主成分的值。
一旦得到了协方差矩阵的特征向量,我们就可以保留最大的N个值。这些特征向量也给出了个最重要特征的真实结构。我们可以通过将数据乘上这N个特征向量而将它转换到新的空间

13.2.2 在Numpy中实现PCA

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

PCA算法,代码如下;

from numpy import *

def loadDataSet(fileName, delim='	'):
    fr = open(fileName)
    #以delim作为分隔符分割数据,默认为'	'
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    #我用的是python3,需要再做一次list转化
    datArr = [list(map(float,line)) for line in stringArr]
    return mat(datArr)

def pca(dataMat, topNfeat=9999999):
    #用mean计算出矩阵每列特征的均值,axis表示列计算
    meanVals = mean(dataMat, axis=0)
    #remove mean
    meanRemoved = dataMat - meanVals 
    #通过cov()计算出协方差矩阵
    covMat = cov(meanRemoved, rowvar=0)
    #通过linalg.eig()算出特征值和特征向量
    eigVals,eigVects = linalg.eig(mat(covMat))
    #sort, sort goes smallest to largest
    #对特征值进行排序,得出的是下标
    eigValInd = argsort(eigVals)
    #cut off unwanted dimensions
    #注意这里的写法,实际上是从倒数第一个(也就是最大的)往左总计N个值           
    eigValInd = eigValInd[:-(topNfeat+1):-1]
    #得出经过筛选的特征向量,由最大到最小排列
    #reorganize eig vects largest to smallest
    redEigVects = eigVects[:,eigValInd]
    #得出降维后的矩阵
    #transform data into new dimensions       
    lowDDataMat = meanRemoved * redEigVects
    #重构矩阵,即得出降维后矩阵在原纬度下是什么样的,便于之后绘图比较
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

测试截图如下:
这里写图片描述

13.3 示例:利用PCA对半导体制造数据降维

本次数据包含很多的缺失值。这些缺失值是以NaN (Not a Number的缩写)标识的。对于这些缺失值,我们有一些处理办法(参考第5章)。在590个特征下,几乎所有样本都有NAN,因此去除不完整的样本不太现实。尽管我们可以将所有的NAN替换成0 ,但是由于并不知道这些值的意义,所以这样做是个下策。如果它们是开氏温度,那么将它们置成0这种处理策略就太差劲了。下面我们用平均值来代替缺失值,平均值根据那些非NAN得到。

将NAN替换成平均值的函数,代码如下:

def replaceNanWithMean(): 
    #以空格为分隔符获取secom.data
    datMat = loadDataSet('secom.data', ' ')
    #求出特征数目
    numFeat = shape(datMat)[1]
    #遍历每列特征,置NAN为每列非NAN特征值的均值
    for i in range(numFeat):
        #values that are not NaN (a number)
        #~isnan返回boolean矩阵,其中不是NAN的位置标为true,是NAN的标为false
        #nonzero返回元组,其中0处为非0(True为非0)元素行标,1处存放0元素行标
        meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) 
        #set NaN values to mean
        #与上一行类似,找出nan元素位置,赋值为该列特征的均值
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  
        return datMat

测试截图如下:
这里写图片描述
这里写图片描述

我们会看到一大堆值,但是其中的什么会引起我们的注意?我们会发现其中很多值都是0。实际上,其中有超过20%的特征值都是0。这就意味着这些特征都是其他特征的副本,也就是说,它们可以通过其他特征来表示,而本身并没有提供额外的信息。
接下来,我们了解一下部分数值的数量级。最前面15个值的数量级大于10510^5,实际上那以后的值都变得非常小。这就相当于告诉我们只有部分重要特征,重要特征的数目也很快就会下降
最后,我们可能会注意到有一些小的负值,它们主要源自数值误差应该四舍五入成0。
在图13-4中已经给出了总方差的百分比,我们发现,在开始几个主成分之后,方差就会迅速下降。

这里写图片描述

表13-1给出了这些主成分所对应的方差百分比和累积方差百分比。浏览“累积方差百分比( % )”这一列就会注意到,前六个主成分就覆盖了数据96.8%的方差,而前20个主成分覆盖了99.3%的方差。这就表明了,如果保留前6个而去除后584个主成分,我们就可以实现大概100 : 1的压缩比。另外,由于舍弃了噪声的主成分,将后面的主成分去除便使得数据更加干净。

这里写图片描述

于是,我们可以知道在数据集的前面多个主成分中所包含的信息量。我们可以尝试不同的截断值来检验它们的性能。有些人使用能包含90%信息量的主成分数量,而其他人使用前20个主成分。我们无法精确知道所需要的主成分数目,必须通过在实验中取不同的值来确定。有效的主成分数目则取决于数据集和具体应用。
上述分析能够得到所用到的主成分数目,然后我们可以将该数目输人到PCA算怯中,最后得到约简后数据就可以在分类器中使用了。

13.4 本章小结

降维技术使得数据变得更易使用,并且它们往往能够去除数据中的噪声,使得其他机器学习任务更加精确降维往往作为预处理步骤,在数据应用到其他算法之前清洗数据。有很多技术可以用于数据降维,在这些技术中,独立成分分析因子分析主成分分析比较流行,其中又以主成分分析应用最广泛。
PCA 可以从数据中识别其主要特征,它是通过沿着数据最大方差方向旋转坐标轴来实现的。选择方差最大的方向作为第一条坐标轴,后续坐标轴则与前面的坐标轴正交。协方差矩阵上的特征值分析可以用一系列的正交坐标轴来获取。

原文地址:https://www.cnblogs.com/kevincong/p/7924227.html