PCA降维原理

一 基本概念

在之前的介绍中,一幅图像只能表示一个对象。那么对于w x h的灰度图像,只能表示为w x h位的向量,那么一个有100*100的图像就需要10000维的向量空间。对于一幅人脸而言,是否所有维的数据都是有用的呢?在矩阵论当中我们知道,矩阵可以近似的表示为一个特征值与特征向量的乘积
根据这个原理,如果我们能够提取出高维向量中某些特有特征或相关变量,就能用一个近似说的低维向量表示这个高维向量。因为对于这个高维向量,只有包含最多信息的那些维上的数据才有意义,而那些不重要的维可以在计算中忽略,降维后的低维向量不会损失掉特征间的差异性。这就是主成分分析的思想。
PCA的基本原理是:一个高维数据集如果能够被相关变量表示,那么自由一些维的数据才有意义,包含最多的信息。如果寻找数据中拥有最大方差的哪些方向,就被称之为向量的主成分。

二 算法推导

这里写图片描述 表示一个随机特征向量,其中这里写图片描述
首先,计算X的均值向量u:
这里写图片描述
然后根据这个均值计算协方差矩阵S:
这里写图片描述
计算S的特征值兰姆达和对应的特征向量v:
这里写图片描述

最对特征值和特征向量进行递减排序。如果定义一个向量有k个主成分,那么这个向量的主成分就是k个最大特征值对应的特征向量。
观测向量x的k个主成分可以表示为:这里写图片描述 ,其中这里写图片描述
PCA基的变换为:这里写图片描述 ,其中这里写图片描述

三 编程实现

子程序

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=9999999):
    meanVals = mean(dataMat, axis=0)#求均值
    meanRemoved = dataMat - meanVals
    covMat = cov(meanRemoved, rowvar=0)#协方差
    eigVals,eigVects = linalg.eig(mat(covMat))#求特征向量特征值
    eigValInd = argsort(eigVals)              #从小到大排序
    eigValInd = eigValInd[:-(topNfeat+1):-1]  #取出特征值最大值
    redEigVects = eigVects[:,eigValInd]       #取出特征值最大值对应的特征向量
    lowDDataMat = meanRemoved * redEigVects   #向量x表示为y
    reconMat = (lowDDataMat * redEigVects.T) + meanVals#pca基的变换x
    return lowDDataMat, reconMat

主程序

from numpy import *
import matplotlib
import matplotlib.pyplot as plt
import pca1

dataMat = pca1.loadDataSet('testSet.txt')
lowDMat, reconMat = pca1.pca(dataMat, 1)

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降维原理_第1张图片

参考资料:
【1】机器学习算法原理与编程实战.郑洁.电子工业出版社
【2】机器学习实战

你可能感兴趣的:(python学习,机器学习)