PCA(主成分分析)--含代码

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()

猜你喜欢

转载自blog.csdn.net/qq_42105426/article/details/88529010