目录:
1.什么是PCA?
2.PCA的作用?
3.PCA步骤?
1.什么是PCA?
PCA(principal components analysis)即主成分分析技术,又称主分量分析。主成分分析也称主分量分析,旨在利用降维的思想,把多指标转化为少数几个综合指标。
在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用于减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。
2.PCA的作用?
主成分分析(Principle Component Analysis)可以用于分析数据中的主要信息,并利用主要信息对数据进行降维处理,这样可以起到数据压缩的效果。
3.PCA步骤?
步骤1:准备数据
假设我们收集了 n 个学生的信息,每个学生收集了 m 个维度的信息,譬如:身高、体重、平均成绩等。因此所有数据可以表示为如下矩阵形式:
步骤2:减去均值
基于 n 个学生信息,计算 m 维上各维度的均值,得到均值向量
x
‾
\overline{x}
x,对每个学生对应的向量执行减去均值操作,得到如下矩阵:
步骤3:计算协方差矩阵
步骤4:计算协方差矩阵的特征值和特征向量
有协方差矩阵 C 计算过程可见其为 m × m 的对称矩阵,结合线性代数知识,可知协方差矩阵可以通过特征分解 (Eigendecomposition) 表示为如下形式:
其中 V∈R^(m×m) ,为所有特征向量构成的矩阵, Λ∈R^(m×m)为特征值构成的对角阵。由协方差矩阵定义可知,若 xi; xj 两两相互独立,则有:
此时协方差矩阵即为如下形式:
此时特征向量即为 R^(m×m) 的基向量,特征值即为相应 xi 的方差。
步骤5:构建特征向量矩阵
选取特征值最大的 k 个特征向量,并构建特征向量 (e) 矩阵
这里选取的 k 个特征向量为我们希望在数据中保留的主成分。
步骤6:生成压缩后的数据集
该步骤为主成分分析的最后步骤,也是最容易的步骤。一旦我们构建好主成分矩阵 F∈R^(m×k) 后,并右乘原来的数据矩阵 X∈R^(n×m),则得到压缩后的数据 X*,计算如下:
X* = XF
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet(fileName):
dataSetList = []
fr = open(fileName)
for row in fr.readlines():
cur_line = row.strip().split('\t')
proce_line = list(map(float,cur_line))
dataSetList.append(proce_line)
dataSetList = array(dataSetList)
return dataSetList
def pca(dataMat, topNfeat = 999999):
meanValues = mean(dataMat,axis=0) # 竖着求平均值,数据格式是m×n
meanRemoved = dataMat - meanValues # 0均值化 m×n维
covMat = cov(meanRemoved,rowvar=0) # 每一列作为一个独立变量求协方差 n×n维
eigVals, eigVects = linalg.eig(mat(covMat)) # 求特征值和特征向量 eigVects是n×n维
eigValInd = argsort(-eigVals) # 特征值由大到小排序,eigValInd十个arrary数组 1×n维
eigValInd = eigValInd[:topNfeat] # 选取前topNfeat个特征值的序号 1×r维
redEigVects = eigVects[:,eigValInd] # 把符合条件的几列特征筛选出来组成P n×r维
lowDDataMat = meanRemoved * redEigVects # 矩阵点乘筛选的特征向量矩阵 m×r维 公式Y=X*P
reconMat = (lowDDataMat * redEigVects.T) + meanValues # 转换新空间的数据 m×n维
return lowDDataMat, reconMat
def drawPoints(dataset1,dataset2): # 画图,dataset1是没降维的数据,dataset2是数据映射到新空间的数据
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212)
ax1.scatter(dataset1[:,0],dataset1[:,1],marker='s',s=40,color='red')
dataset2 = array(dataset2)
ax2.scatter(dataset2[:,0],dataset2[:,1],s=40,color='blue')
plt.show()
if __name__ == '__main__':
data = loadDataSet('data_path')
proccess_data, reconMat = pca(data,1)
drawPoints(data,reconMat)