《机器学习实战笔记--降维技术 利用PCA来简化数据》

    将含有很多特征的数据,简化到只有少数最重要的特征,这就被称为降维。在低维下,数据更容易被处理,另外,其相关特征可能在数据中明确显示出来。通常而言,在应用机器学习算法之前,必须先识别出其相关特征。

    在降维中,对数据进行了预处理。之后,采用其他机器学习技术对其进行处理。

1.1 降维技术

    数据简化有下列一些列原因:

        数据集更易用;

        降低算法计算开销;

        去除噪声;

        使结果更易懂;

    在有监督与无监督数据上都有降维技术。

    主成成分分析(PCA:principal component analysis)。在PCA中,数据从原来的坐标转化到了新的坐标系中,新坐标系的选择是由原来的数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面几个新坐标轴中。因此我们可以忽略剩下的坐标轴了,即对数据进行了降维处理。

    因子分析(factor analysis)。在因子分析中,我们假设数据中有一些观察不到的隐变量。假设数据是由这些隐变量和某些噪声的线性组合。那么隐变量可能会比观察数据的数目少,也就是说找到了隐变量就可以实现数据的降维。

   独立成分分析(independent component analysis, ICA)ICA假设数据是从N个数据源生成的,这一点和因子分析有一些相似。假设数据为多个数据源的混合观察结果,这些数据源之间在统计上是互相独立的,而PCA只是假设不相关。同样也可以实现数据降维。

1.2 PCA

                          

1.2.1 移动坐标轴

    

    在上图中我们画出一条直线,这条线要尽可能的覆盖这些点。那么最长的线可能是哪条? B是最长的直线

    在PCA中,我们对数据的坐标进行了旋转,该旋转的过程取决于数据的本身。第一条坐标轴旋转到覆盖数据的最大方差位置,即图中的直线B。数据的最大方差给出了数据最重要的信息。

    在选择了覆盖数据最大差异性的坐标轴之后,我们选择了第二条坐标轴。假如该坐标轴与第一条坐标轴垂直,它就是覆盖数据次大差异性的坐标轴。更严谨的说是正交,二维平面内正交和垂直式一回事。即C直线就是第二条坐标。利用PCA技术,我们将数据坐标轴旋转到数据角度上那些最重要的方向。

    我们已经实现了坐标轴的旋转,现在开始讨论降维。只是旋转坐标并没有减少数据的维度。

     

    上图包含三个不同的类别,要区分这三个类别可以使用决策树等。决策树每次都是根据一个特征来进行划分的,我们发现使用x的值可以很好的将这三个类别分开。这样我们可以得到一些规则,比如x在某个范围里就是那个类别等。如果我们使用SVM这样的复杂分类器,我们可能会得到更好的分类间隔,但是分类超平面却很难解释。

    通过PCA进行降维后,就可以同时获得SVM与决策树的优点:一方面得到了和决策树一样简单的分类器,同时分类间隔和SVM一样好。13-2下面那个图就是PCA转化得来的。如果使用原始数据,那么这里的间隔会比决策树的间隔更大。另外只用考虑一维的信息,就可以使用比SVM简单的多的规则进行区分。

     在图13-2中,我们只需要一维的信息就可以了,因为另一维的信息只是对分类缺乏贡献的噪声数据。在二维中,这一点看上去可能微不足道,但是在高维空间下,则意义重大。

    PCA的第一个主成分是从数据差异性最大(即方差最大)的方向提取出来的,第二个则是来自于数据差异次大的方向,并且与第一个主成分方向正交。通过对数据集的协方差矩阵及其特征值的分析,我们可以求出这些主成分的值。

    一旦得到了协方差矩阵的特征向量,我们就可以保留最大的N个值。这些特征向量也给出了N个最重要特征的真实结构。我们通过将数据乘上这N个特征向量而将他转换到新的空间。

        

1.2.2 在Numpy中实现PCA

    将数据转换为前N个主成分的伪代码:

     

from numpy import *

def loadDateSet(filename, delim='\t'):
    fr = open(filename)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [list(map(float,line)) for line in stringArr]
    return mat(datArr)

def pca(dataMat, topNfeat=9999999):
    '''
    desc:   topNfeat :可选参数,应用的N个特征
    '''
    # 计算减去原始数据集的平均值(每一个特征的平均值)
    meanVals = mean(dataMat, axis=0) # 按列求平均
    meanRemoved = dataMat - meanVals
    
    # 计算协方差矩阵
    covMat = cov(meanRemoved, rowvar=0)
    eigVals,eigVects = linalg.eig(mat(covMat)) # 协方差矩阵的特征值, 特征向量
    print('eigVals:', eigVals)
    print('eigVects:', eigVects)
    
    '''
    选取大的特征值对应的特征向量
    '''
    eigValInd = argsort(eigVals) # 特征值从小到大排列并输出其索引
    eigValInd = eigValInd[:-(topNfeat+1):-1]  # 逆序就可以得到topNfeat个最大的特征值
    redEigVects = eigVects[:,eigValInd]  # 选取最大的topNfeat个特征值对应的特征向量
    
    # 降维后的数据
    lowDDataMat = meanRemoved * redEigVects   # 低维数据 
    reconMat = (lowDDataMat * redEigVects.T) + meanVals # 原坐标系下的降维数据
    return lowDDataMat, reconMat

    下面看一下运行效果:

    

    这里把二维的数据提取成一维:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0], dataMat[:,1].flatten().A[0], marker='^', s=90)
ax.scatter(reconMat[:,0].flatten().A[0], reconMat[:,1].flatten().A[0], marker='o', s=50, c='red')
plt.show()

    画出原图与新的图:

    降维后的数据。

     现在我们不降特征维度:

lowDMat, reconMat = pca(dataMat, 2)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0], dataMat[:,1].flatten().A[0], marker='^', s=90)
ax.scatter(reconMat[:,0].flatten().A[0], reconMat[:,1].flatten().A[0], marker='o', s=50, c='red')
plt.show()

    画出的结果:

      因为没有剔除任何特征,所以可以看到恢复了原始的数据。

1.3 利用PCA对半导体数据进行降维

    数据集中有590个特征,包含了许多的缺失值。这里我们使用均值来替换确实值,平均值是根据那些非空值来计算的。

    

def replaceNanWithMean():
    datMat = loadDateSet('secom.data', ' ')
    numFeat = shape(dataMat)[1]
    for i in range(numFeat):
        meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #values that are not NaN (a number)
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  #set NaN values to mean
    return datMat

  我们现在已经去除了所有的nan,现在考虑在该数据集上使用PCA。首先确认所需的特征和可以去掉的特征的数目。PCA会给出数据中包含的信息量。  数据 和 信息 之间有巨大的差别。数据指的是原始的材料,其中可能包含噪声和不相关的信息。信息则是指其中的相关部分。这些不只是抽象的概念,我们还可以定量的计算数据中所包含的信息并决定保留的比例。

    我们不只关心最后的输出结果也要了解中间的结果,首先去除均值计算协方差矩阵观察:

    

    

    发现其中超过20%的值都是0,这就意味着这些特征都是其他特征的副本,也就是说可以用其他特征来表示,本身没有提供额外的信息。

    只有最前面的15个数量级大于10^5,在此之后的值都非常小了。这就告诉了我们只有部分重要特征,重要特征的数目会很快下降。

    

    上图是总方差的百分比,在开始的几个主成成分之后,方差会迅速的下降。

    

    上表是累计方差百分比。可以看到,前六个主成成分覆盖了96.8%的方差。就意味着我们只保留前面6个而丢弃后面584个特征就可以做到100:1的压缩比。另外,由于去除了噪声的主成分,将后面的主成分去除会使得数据更加干净。

2. 本章小结

    降维技术使得数据变得更加易用,而且往往能够去除噪声,使得机器学习任务变得更加精确。通常作为预处理步骤对进行清洗。

    PCA可以从数据中识别其主要特征,它是通过沿着数据最大方差方向旋转坐标轴实现的。选择方差最大的方向作为第一条坐标轴,后续坐标轴与前面的坐标轴正交。协方差矩阵上的特征值分析可以用一系列的正交坐标轴来获取。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值