PCA算法

主成分分析(PCA)是一种基于变量协方差矩阵对数据进行压缩降维、去噪的有效方法,PCA的思想是将n维特征映射到k维上(k 所以我们的做法就是求得一个k维特征的投影矩阵,这个投影矩阵可以将特征从高维降到低维。投影矩阵也可以叫做变换矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。通过求样本矩阵的协方差矩阵,然后求出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值的大小。经过 PCA 分析,一个多变量的复杂问题被简化为低维空间的简单问题。可以利用这种简化方法进行作图,形象地表示和分析复杂问题。

PCA过程


第一步,获取数据,下图中的Data为原始数据,一共有两个维度,可看出二维平面上的点。

第二步,减去平均值,对于Data中的每一维数据分别求平均值,并减去平均值,得到DataAdjust数据。

第三步,计算DataAdjust的协方差矩阵

第四步,计算协方差矩阵的特征向量和特征值,选取特征向量

第五步,将样本点投影到选取的特征向量上,得到新的数据集


伪代码如下


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



如何选择主成分

做法是根据特征值的贡献率选取前p个最大特征向量及其对应的特征向量,贡献率是指选取的特征值的和与占所有特征值的和比,即:

                                                                           PCA算法_第1张图片
一般取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()

2DPCA

PCA算法_第2张图片


主成分分析PCA

奇异值分解(SVD)原理详解及推导

PCA ,PCAWhitening ,ZCAWhitening

解释一下核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程~

PCA主成分分析

UFLDL学习笔记2(Preprocessing: PCA and Whitening)

PCA的数学原理




你可能感兴趣的:(机器学习&&数据挖掘)