机器学习经典算法11-PCA

来源:互联网 发布:淘宝卖家怎么查看访客 编辑:程序博客网 时间:2024/05/21 07:15

1.基本介绍

         我们人眼最多能看到3维的东西,但是现实生活中有很多大于3维的东西,那么如何对这些数据进行可视化?此外,对多维的数据是否可以压缩以减小存储空间?这都可以用降维的方式达到目的,其中使用广泛的就是PCA(Principle Component Analysis),PCA可以用来降低算法计算开销、去除噪声、使得结果易于展示和理解等。
        PCA可以看成在现有的n维上的数据点找到n-1维的平面,使得n维上的数据点到n-1维面上的投影距离之和最小。
        这里假设训练集中有m个样本或实例,每个样本的特征或属性数为n。

2.基本流程

       将数据抓换成前N个(即从n维变为N维)主成分的伪代码:
       1.数据预处理。这里预处理包含两个部分:均值归一化和属性范围调整。均值归一化是相应属性减去其平均值;而属性范围则在归一化基础上除以属性方差。
       2.计算特征之间的协方差矩阵。该矩阵是一个n*n的对称矩阵
       3.计算协方差矩阵的特征值和特征向量
       4.将特征值从大到小排序
       5.保留最上面的N个特征向量
       6.将原数据映射到由N个特征向量构成的新空间中

3.代码示例

         这里协方差矩阵covMat是n*n,而N个特征向量组成的矩阵为redEigVects为n*N维,降维后的数据为lowDDataMat为m*N维,reconMat是降维后还原为n维的数据
from numpy import *import matplotlib.pyplot as pltdef loadDataSet(fileName, delim='\t'):    fr = open(fileName)    stringArr=[line.strip('\n').split(delim) for line in fr.readlines()]    fr.close()    datArr=[map(float,line) for line in stringArr]    return mat(datArr)def pca(dataMat, topNfeat=9999):    meanVals = mean(dataMat, axis=0)    meanRemoved = dataMat-meanVals    covMat=cov(meanRemoved, rowvar=0)    print covMat    eigVals, eigVects=linalg.eig(mat(covMat))    eigValInd=argsort(eigVals)    eigValInd=eigValInd[:-(topNfeat+1):-1]    redEigVects=eigVects[:,eigValInd]    lowDDataMat=meanRemoved*redEigVects    reconMat=(lowDDataMat*redEigVects.T)+meanVals    return lowDDataMat, reconMatdataMat=loadDataSet("testSet.txt")low, rec=pca(dataMat,1)i=0while i<shape(dataMat)[0]:    print dataMat[i,:],"_",rec[i,:]    i=i+1

testSet.txt中的数据可以为如下:
1.658985 4.285136
-3.453687 3.424321
4.838138 -1.151539
-5.379713 -3.362104
0.972564 2.924086
-3.567919 1.531611
0.450614 -3.302219
-3.487105 -1.724432
2.668759 1.594842
-3.156485 3.191137
3.165506 -3.999838
-2.786837 -3.099354


原创粉丝点击