pca是一个比较常用的数据降维的方法,可以这样理解:
数据是分布在多维空间的,例如房价的影响因素有:位置,大小,楼层等,可以把这些影响因素当成多维空间的维度。
影响房价的因素是有权重的,权重越大影响就越大,所以方差在这个维度上就越大。如地理位置的权重是100,房屋大小权重是1 ,那么在位置影响的方差就远远大于房屋大小的方差i
Pca就是选较大的方差的因素,在尽可能小的维度上表示
1.去除平均值(为了使数据0中心化)
2.计算协方差矩阵
3.计算协方差矩阵的特征值和特征向量
4.将特征值从小到大排列
5.保留N个特征向量
6.数据用N个特征向量表示
#!/usr/bin/python
# coding:utf-8
# 19-3-7 下午4:05
# @File : PCA
import numpy as np
import os
def loadDataSet(fileName, delim='\t'):
fr = open(os.path.join(os.getcwd(), fileName))
str = fr.readline()
stringArr = [line.strip().split(delim) for line in fr.readlines()]
# map(函数,数) return list(py2) map()函数不改变原有的 list,而是返回一个新的 list。
# 利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。
dataArr = [map(float, line) for line in stringArr]
return np.mat(dataArr) # convert dataArr to matric
def pca(dataMat, topNfeat= 9999999):
meanVals = np.mean(dataMat, axis=0)
print meanVals.shape
meanRemoved = dataMat - meanVals #remove mean
covMat = np.cov(meanRemoved, rowvar=0) # each row represent a varible
eigVals, eigVects = np.linalg.eig(np.mat(covMat)) #gets eigvals and eigVects
eigValInd = np.argsort(eigVals)
eigValInd = eigValInd[:-(topNfeat+1):-1] #cutoff unwanted
#a[::-1],这里第三属性 -1,表示从后向前
#a[.....-3,-2,-1]表示其中的索引 -(topfeat+1) 代表取到倒数第几个
redEigVects = eigVects[:, eigValInd] #recoganzie eig vects
lowDataMat = meanRemoved * redEigVects #transform data into new
reconMat = (lowDataMat * redEigVects.T) + meanVals
return lowDataMat, reconMat
def main():
path = raw_input('please path :')
data = loadDataSet(path)
print pca(data, 2)
if __name__ == '__main__':
main()