主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,PCA的思想是将n维特征映射到k维上(k
PCA过程
第一步,获取数据,下图中的Data为原始数据,一共有两个维度,可看出二维平面上的点。
第二步,减去平均值,对于Data中的每一维数据分别求平均值,并减去平均值,得到DataAdjust数据。
第三步,计算DataAdjust的协方差矩阵
第四步,计算协方差矩阵的特征向量和特征值,选取特征向量
第五步,将样本点投影到选取的特征向量上,得到新的数据集
伪代码如下
减去平均数
计算协方差矩阵
计算协方差矩阵的特征值和特征向量
将特征值从大到小排序
保留最大的K个特征向量
将数据转换到上述K各特征向量构建的新空间中
做法是根据特征值的贡献率选取前p个最大特征向量及其对应的特征向量,贡献率是指选取的特征值的和与占所有特征值的和比,即:
一般取a=99%,即使训练样本在前p个特征向量集上的投影有99%的能量,这前p个特征值对应的特征向量就构成了投影矩阵
这里提一下协方差矩阵,这个在GMM中也会用到,其意义是什么
python实现
# -*- coding: cp936 -*-
import matplotlib
import matplotlib.pyplot as plt
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=999999):
meanVals = mean(dataMat, axis=0)
DataAdjust = dataMat - meanVals #减去平均值
covMat = cov(DataAdjust, rowvar=0)
eigVals,eigVects = linalg.eig(mat(covMat)) #计算特征值和特征向量
#print eigVals #计算协方差矩阵
eigValInd = argsort(eigVals) #对特征值排序
eigValInd = eigValInd[:-(topNfeat+1):-1] #保留最大的前K个特征值
redEigVects = eigVects[:,eigValInd] #对应的特征向量
lowDDataMat = DataAdjust * redEigVects #将数据转换到低维新空间
reconMat = (lowDDataMat * redEigVects.T) + meanVals #重构数据,用于调试
return lowDDataMat, reconMat
dataMat = loadDataSet('testSet.txt')
lowDMat, reconMat = pca(dataMat,1)
print "shape(lowDMat): ",shape(lowDMat)
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()
主成分分析PCA
奇异值分解(SVD)原理详解及推导
PCA ,PCAWhitening ,ZCAWhitening
解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程~
PCA主成分分析
UFLDL学习笔记2(Preprocessing: PCA and Whitening)
PCA的数学原理