PCA主成分分析
主成分分析
PCA:principal component analysis
主成分分析是最常用的一种降维分析
目的:降低数据的复杂性,找到最有用的特征
降维:
- PCA
- FA 因子分析 factor analysis
- ICA 独立成分分析 independent component analysis
PCA概述:
将数据从原来的坐标系转换到新的坐标系,新坐标的选择和数据本身相关。第一个新坐标轴是原数据中方差最大的方向,第二个坐标选择和第一个坐标正交且具有最大方差的方向。
数据最大方差方向
方差最大,就是数据差异性最大
计算协方差矩阵&特征值分析
特征值分析
\[A\nu=\lambda \nu\]
特征值\(\lambda\)和特征向量\(\nu\)
可以使用Numpy中linalg模块的eig()
numpy.linalg.eig(a)
# Compute the eigenvalues and right eigenvectors of a square array.
from numpy import linalg as LA
w, v = LA.eig(np.diag((1, 2, 3)))
w; v
"""
array([ 1., 2., 3.])
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
"""
使用numpy实现PCA
"""
created dec,6 2018
@author dengshuo
implement the pca with numpy
"""
# import packages
from numpy import *
# load the data
def loadDataSet(filename):
fr=open(filename)
lineStr=[line.strip().split('\t') for line in fr.readlines()]
dataArr=[list(map(float,line)) for line in lineStr]
# 一般涉及到 map函数都要加上一个 list来实现
return mat(dataArr)
def PCA(datamat,topNFeat=9999999):
meanVal=mean(datamat,axis=0)
# 数据全部减去平均值
mean_reduce=datamat-meanval
# 使用协方差矩阵
cov_mat=cov(mean_reduce,rowvar=0) # 参考 dash cov的手册
eigVal,eigVector=linalg.eig(mat(cov_mat))
# 将特征值进行排序,升序排序
# 注意这个返回的 是其在原数组中下标
eigValInOrder=argsort(eigVal)
eigValInOrder=eigValInOrder[:-(topNFeat+1):-1]
redEigVector=eigVector[:,eigValInOrder]
# 将数据转换到原空间
lowDataMat=mean_reduce*redEigVector
reconMat=(lowDataMat*redEigVector.T)+meanVal
return lowDataMat,reconMat
if __name__ == '__main__':
t=loadDataSet('testSet.txt')
print("{}".format(t))