博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PCA降维处理
阅读量:4608 次
发布时间:2019-06-09

本文共 2132 字,大约阅读时间需要 7 分钟。

数据集中含有太多特征时,需要简化数据。降维不是删除部分特征,而是将高维数据集映射到低维数据集,映射后的数据集更简洁,方便找出对结果贡献最大的部分特征。

简化数据的原因:

1、使得数据集更易使用

2、降低很多算法的计算开销

3、去除噪声

4、使得结果易懂

PCA:principal component analysis,主成分分析。数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。

PCA算法伪代码:

去除平均值计算协方差矩阵计算协方差矩阵的特征值和特征向量将特征值从大到小排序保留最大的N个特征值将数据转换到上述N个特征向量构建的新空间中

 代码:

from numpy import *def loadDataSet(filename,delim='\t'):    f=open(filename)    stringArr=[line.strip().split(delim) for line in f.readlines()]    dataArr=[list(map(float,line)) for line in stringArr]    return mat(dataArr)def pca(dataMat,topNfeat=9999999):    meanVals=mean(dataMat,0)    meanRemoved=dataMat-meanVals    covMat=cov(meanRemoved,rowvar=0)    #默认把每行看成一个变量,rowvar=0表示把每列看成一个变量    eigVals,eigVects=linalg.eig(mat(covMat))    eigValInd=argsort(eigVals)    eigValInd=eigValInd[:-(topNfeat+1):-1]    redEigVects=eigVects[:,eigValInd]    # print(redEigVects)    lowDDatMat=meanRemoved*redEigVects    reconMat=(lowDDatMat*redEigVects.T)+meanVals    #协方差矩阵时对称矩阵,对称矩阵的特征向量的逆矩阵等于特征向量的转置矩阵    return lowDDatMat,reconMat

 将原始数据和降维后的数据绘制成散点图:

def plotPoint(dataMat,reconMat):    import matplotlib.pyplot as plt    fig=plt.figure()    ax=fig.add_subplot(111)    ax.scatter(dataMat[:,0].flatten().A[0],dataMat[:,1].flatten().A[0],marker='^',c='r',s=30)    ax.scatter(reconMat[:,0].flatten().A[0],reconMat[:,1].flatten().A[0],marker='*',c='y',s=10)    plt.show()

 测试:

dataMat=loadDataSet('testSet.txt')    lowDMat,reconMat=pca(dataMat,1)    plotPoint(dataMat,reconMat)

 输出:

 利用PCA对半导体制造数据降维过程中的空值处理:将空值替换成对应特征的平均值

def replaceNanWithMean():    dataMat=loadDataSet('secom.data',' ')    numFeat=shape(dataMat)[1]    for i in range(numFeat):        meanVal=mean(dataMat[nonzero(~isnan(dataMat[:,i].A))[0],i])        dataMat[nonzero(isnan(dataMat[:,i].A))[0],i]=meanVal    return dataMat

 测试:

if __name__=='__main__':    dataMat=replaceNanWithMean()    lowDDatMat, reconMat=pca(dataMat,6)    print(lowDDatMat[0])

 输出:

[[5183.89616507+0.j 3022.64772377+0.j -688.38624272+0.j   57.92893142+0.j  -349.28054496+0.j  -41.1987254 +0.j]]

 输出的是第一条记录,只保留了6个特征。

 

转载于:https://www.cnblogs.com/zhhy236400/p/9996262.html

你可能感兴趣的文章
Junit常用操作
查看>>
[原]VS2012编译GLEW 1.11
查看>>
vod_play.html修改播放器页面模板
查看>>
Python 常用的内置函数
查看>>
Console 程序在任务计划程序无法读写文件
查看>>
Visual Studio 2017创建XAML文件
查看>>
第三十章 网路编程------线程
查看>>
C++第9周项目3参考——利息计算器
查看>>
元音字母
查看>>
一个用户多个订单
查看>>
BZOJ4009: [HNOI2015]接水果
查看>>
Flask filter过滤器
查看>>
个人简介
查看>>
Go语言核心之美-必读
查看>>
【Jsp】JSP自己定义标签与MODEL1、MODEL2标准
查看>>
Navicat Premium 12 模型导出sql
查看>>
BZOJ1396识别子串(后缀自动机)
查看>>
全选反选
查看>>
治愈系课程教材 第四课
查看>>
DataSourceUtils源码分析
查看>>