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 plt
def 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, reconMat
dataMat=loadDataSet("testSet.txt")
low, rec=pca(dataMat,1)
i=0
while 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
-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