注意协方差的理解:协方差是用来衡量数据相互联系程度的量,协方差矩阵是用来衡量多维数据中每一维的相互联系
通过协方差计算数据中的主要成分 从而主成分分析。
机器学习实战 PCA程序
# -*- coding: utf-8 -*- from numpy import * import numpy as np #加载数据集 与之前有点不同 def loadDataSet(fileName, delim=' '): #打开文本文件 fr = open(fileName) #对文本中的每一行分开 stringArr = [line.strip().split(delim) for line in fr.readlines()] #利用map函数将每一行的数据值映射为float中 datArr = [map(float,line) for line in stringArr] return mat(datArr) #主成分分析(参数为数据集和默认维度) def pca(dataMat, topNfeat=9999999): #求平均值 meanVals = mean(dataMat, axis=0) #移除平均值 meanRemoved = dataMat - meanVals #计算协方差矩阵 covMat = cov(meanRemoved, rowvar=0) #求解特征向量和特征值 eigVals,eigVects = linalg.eig(mat(covMat)) #从小到大排序的索引值 eigValInd = argsort(eigVals) #从大到小排序的索引值 并剔除多余维度 eigValInd = eigValInd[:-(topNfeat+1):-1] #从大到小的特征向量 redEigVects = eigVects[:,eigValInd] #将数据转换到新的维度(数据乘以N个特征向量) lowDDataMat = meanRemoved * redEigVects #原矩阵被重构 reconMat = (lowDDataMat * redEigVects.T) + meanVals #返回压缩后的矩阵和由该矩阵重构出来的原矩阵 return lowDDataMat, reconMat #画出降维后的数据和原始数据 def plotPca(): filename = 'testSet.txt' dataMat=loadDataSet(filename) lowDMat,reconMat=pca(dataMat,1) import matplotlib import matplotlib.pyplot as plt fig=plt.figure() ax=fig.add_subplot(lll) #三角形表示原始数据点 ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',s=90) #圆形点表示第一主成分点,点颜色为红色 ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0], marker='o',s=90,c='red') #后面的 利用pca降维半导体数据 def replaceNanWithMean(): #加载数据集 datMat = loadDataSet('secom.data', ' ') #得到特征数目 numFeat = shape(datMat)[1] #将datMat转换为float map(map, [float, float], datMat) #在所有的特征上循环 对每个特征向量的每个特征 for i in range(numFeat): #计算非NaN值的平均值 meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) #将所有的NaN设置为平均值 datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal return datMat ''' if __name__ == '__main__': filename = 'testSet.txt' dataMat=loadDataSet(filename) lowDMat,reconMat=pca(dataMat,1) #画图 plotPca() '''