机器学习实战第13章——利用PCA简化数据

目录

一、降维技术

二、PCA

2.1 移动坐标轴

2.2 在NumPy中实现PCA 

三、利用PCA对半导体制造数据降维 

四、总结


一、降维技术

数据和结果的展示是一个难题,一些情况下结果显示是三维图像,但数据往往拥有超出显示能能力的更多特征。数据显示也并非是大规模特征下的唯一难题,对数据简化有如下几个原因:

        1、使得数据集更容易使用

        2、降低很多算法的计算开销

        3、去除噪声

        4、使得结果易懂

书中介绍了三种降维方法:主成分分析、因子分析、独立成分分析

主成分分析(Principal Component Analysis,PCA):在PCA中数据从原来的坐标系中转换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。重复过程,次数为原始数据中特征的数目。而这些方差大部分都包含在了最前的几个坐标轴之中,因此就可以忽略余下的坐标轴,起到了对数据的降维处理。

因子分析(Factor Analysis):假设在观察数据的生成中存在一些观察不到的隐变量。而我们观察到的数据是这些隐变量与某些噪声的线性组合。那么隐变量的数据可能比观察数据的数目少,即找到隐数据就能实现数据的降维。

独立成分分析(Independent Component Analysis, ICA):假设数据是从N个数据源生成的,且是由多个数据源混合观察的结果,统计上这些数据源之间是相互独立的,PCA只是假设数据是不相关的。同因子分析一样若数据源的数目少于观察数据的数目,可以实现降维过程。

二、PCA

主成分分析(PCA):

        优点:降低数据的复杂性,识别最重要的多个特征。

        缺点:不一定需要,且可能会损失有用信息

        适用数据类型:数值型数据

2.1 移动坐标轴

        画出一条直线使其尽可能的覆盖图1中的数据点。在PCA中对数据的坐标进行旋转,旋转的过程取决于数据本身。第一条坐标轴旋转到覆盖数据的最大方差位置,数据的最大方差给出了数据的重要信息。

        选择了覆盖数据最大差异性的坐标轴之后,选择第二条坐标轴。若该坐标轴与第一条坐标轴垂直,即覆盖数据次大差异性的坐标轴,亦或者将其称为正交。在二维平面下也就是垂直的意思。 

图1  覆盖数据集的三条直线

                坐标轴的旋转并没有减少数据的维度。对于图2其中包含有3个不同的类别。如果想区分这三个类别,就可以使用决策树。在x轴上寻找一些值以将这3个类区分开。通过使用PCA进行降维处理,可以同时获得SVM和决策树的优点:一方面,得到了和决策树一样简单的分类器,同时分类间隔与SVM一样好。同时由于只需要考虑一维信息,数据就可以通过比SVM简单得多的规则进行区分。

图2  二维空间的3个类别

         图2中我们只需要一维信息就行。另一维信息只是对分类缺乏贡献的噪声数据。这一点在二维图像上看不出什么,但如果在高维空间下则意义重大。

2.2 在NumPy中实现PCA 

将数据转换为前N个主成分的伪码大致如下:

        去除平均值

        计算协方差矩阵

        计算协方差矩阵的特征值和特征向量

        将特征值从大到小排序

        保留最上面的N个特征向量

        将数据转换到上述N个特征向量构建的新空间

python代码实现,创建一个pca.py文件:

from numpy import *


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


def pca(dataMat, topNfeat=9999999):
    meanVals = mean(dataMat, axis=0)  # 取平均值
    meanRemoved = dataMat- meanVals   # 去平均值
    covMat = cov(meanRemoved, rowvar=0)
    eigVals, eigVects = linalg.eig(mat(covMat))
    # 从小到大对N个值进行从小到大的排序
    eigValInd = argsort(eigVals)
    eigValInd = eigValInd[:-(topNfeat + 1):-1]
    redEigVects = eigVects[:, eigValInd]
    # 将数据转换到新空间
    lowDDataMat = meanRemoved * redEigVects
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

        使用两个list comprehension来构建矩阵,pca函数有两个参数:第一个用于PCA操作的数据集,第二个参数topNfeat则是一个可选参数,应用N个特征,不指定参数的值时返回前9999999个特征。

        计算并减去原始数据集的平均值,计算协方差矩阵以及其特征值,接着利用argsort()函数对特征值进行从小到大的排序,根据特征值排序结果的逆序就可以得到topNfeat个最大的特征向量。由特征向量构成后面对数据进行转换的矩阵,并利用N个特征值将原始数据转换到新空间中。原始数据最终将被重构并返回用于测试,同时降维之后的数据集也被返回了。

测试:

import matplotlib.pyplot as plt
from numpy import *
import pca

dataMat = pca.loadDataSet('D:\\learning\\testSet.txt')
lowDMat, reconMat = pca.pca(dataMat, 1)
w = shape(lowDMat)
print(w)

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()
图3  测试结果原始数据为三角形,第一主成分为圆形点

三、利用PCA对半导体制造数据降维 

        使用的数据集为书中的secom.data。​​

def replaceNanWithMean():
    daMat = loadDataSet('D:\\learning\\secom.data', ' ')
    numFeat = shape(daMat)[1]
    for i in range(numFeat):
        meanVal = mean(daMat[nonzero(~isnan(daMat[:, i].A))[0], i])
        daMat[nonzero(isnan(daMat[:, i].A))[0], i] = meanVal
    return daMat

打开并计算了数据集中的特征值,然后在所有特征上进行循环,对于每个特征计算非NaN的值的平均值,并将所有NaN值替换成该平均值,确定所需特征以及可以去除的特征的数目,

测试结果如下: 

dataMat = pca.replaceNanWithMean()
meanVals = mean(dataMat, axis=0)
meanRemoved = dataMat - meanVals
covMat = cov(meanRemoved, rowvar=0)
eigVals, eigVects = linalg.eig(mat(covMat))
print(eigVals)

可以看出在输出很多值的同时会出现很多0值,这些特征都是其他特征的副本,即他们可以通过其他特征表示,而其本身没有提供额外的信息。

四、总结

        降维技术能够使得数据变得更易使用,且能够去除数据中的噪声,降维一般作为预处理步骤,在数据应用到其他算法之前清洗数据。在众多的降维技术中,独立成分分析、因子分析和主成分分析较为流行,这里介绍的就是主成分分析(PCA)。它可以从数据中识别其他主要特征,通过沿着数据最大方差方向旋转坐标轴实现。以方差最大方向作为第一条坐标轴,后续坐标轴与前面的坐标轴正交。

        

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值