利用PCA简化数据

来源:互联网 发布:工业控制网络电子版 编辑:程序博客网 时间:2024/05/17 02:30

利用PCA简化数据


用途

主成分分析(Principal Component Analysis)可以把大量的数据的维度减小,也可以叫做降维
这么做的好处如下:

  • 使得数据更容易使用
  • 降低很多计算的开销
  • 去除噪声
  • 使得结果易懂

本质

通过将原来的数据从高维度的坐标系映射到低维度新的坐标系来,这里有一篇很不错的例子:主元分析(PCA)理论分析及应用。

PCA过程简述

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

代码

读取数据

def loadDateSet(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))#计算特征值(eigVals)和特征向量(eigVects)    eigValInd = argsort(eigVals)#argsort返回排序好后的序号    eigValInd = eigValInd[:-(topNfeat+1):-1]# mat[a:b:c] 表示下标从a到b间隔为c    redEigVects = eigVects[:,eigValInd]#Matrix 选择 mat[a,b] a可以用范围a1:a2 直接:表示所有    lowDDataMat = meanRemoved * redEigVects#降维后的数据    reconMat = (lowDDataMat * redEigVects.T) + meanVals#降维后的数据重构 方便调试    return lowDDataMat,reconMat

测试部分

def test():    dataMat = loadDateSet('machinelearninginaction/Ch13/testSet.txt')    lowDMat,reconMat = pca(dataMat,1)    print shape(lowDMat)    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='o',s=50)    ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')

测试结果

测试结果

数据集 testSet.txt下载

错误使用PCA的例子

ng的视频里面在最后提到了关于PCA使用的注意点

将其用于防止过拟合

这么做减少了特征的数量,非常不好。防止过拟合其实可以使用别的方法,比如归一化处理。因为PCA只是近似地利用方差来丢弃特征,并不考虑与结果变量相关的信息,因此可能丢弃重要的特征。
而归一化不一样,会考虑结果变量,所以不用担心丢失重要的数据。

默认将PCA当作是学习过程的一部分

虽然很多时候效果不错,但还是应当先从原始数据开始,只有在必要时候才会去考率PCA。

参考内容

ng的机器学习coursera课程
《机器学习实战》
主元分析(PCA)理论分析及应用

1 0