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))
posted @ 2018-12-06 17:53  dengshuo7412  阅读(587)  评论(0编辑  收藏  举报