py2.7《机器学习实战》利用PCA来简化数据

最近看了PCA降维,很多地方还是不理解,还是线代学的太差了,但是书上总结的还是挺精简的

一、在Numpy中实现PCA

1、伪代码:

(1)去除平均值(均值归0方便计算方差)

(2)计算协方差矩阵

(3)计算协方差矩阵的特征值和特征向量(利用Numpy中的linalg方法)

(4)将特征值从大到小排序

(5)保留最上面的N个特征向量

(6)将数据转换到上述N个特征构建的新空间中


2.PCA算法

源代码:

#-*- coding:utf-8 -*-
from numpy import *

def loadDataSet(fileName , delim = '\t'):
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()] #这姿势真是太高大上了
    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] #选取最大的前topNfeat个,默认9999999,这里是反向选取
    redEigVect = eigVects[:,eigValInd]
    lowDDataMat = meanRemoved*redEigVect #转换空间
    reconMat = (lowDDataMat *redEigVect.T ) + meanVals 
    return lowDDataMat , reconMat  #返回重构后的原始数据和降维后的数据
执行代码:

#-*- coding:utf-8 -*-
import pca
import matplotlib.pyplot as plt
dataMat = pca.loadDataSet('testSet.txt')
lowDMat , reconMat = pca.pca(dataMat,1)
fig = plt.figure()
ax = fig.add_subplot(111) #构造图形
ax.scatter(dataMat[:,0].flatten().A[0] , dataMat[:,1].flatten().A[0],marker='^',s=90,c='red')
ax.scatter(reconMat[:,0].flatten().A[0] , reconMat[:,1].flatten().A[0],marker='o',s=50,c='red')
plt.show()


效果:






二、利用PCA对半导体制造数据降维

源代码:

def replaceNanWithMean(): #处理NaN值,这里采取平均值法
    dataMat = loadDataSet('secom.data' , ' ')
    numFeat = shape(dataMat)[1] #计算出特征数目
    for i in range(numFeat): #对每个特征计算非NaN的均值
        meanVal = mean(dataMat[nonzero(~isnan(dataMat[:,i].A))[0],i]) #不是NAN的所有值的平均值
        dataMat[nonzero(isnan(dataMat[:,i].A))[0],i] = meanVal
    return dataMat

执行代码

#-*- coding:utf-8 -*-
from numpy import *
import pca
import matplotlib.pyplot as plt
dataMat = pca.replaceNanWithMean()
meanVal = mean(dataMat,axis=0) #均值
meanRemoved = dataMat  - meanVal #尽力归零化
covMat = cov(meanRemoved,rowvar=0) #协方差矩阵
eigVals , eigVects = linalg.eig(mat(covMat)) #特征值分析
print eigVals #检查特征值:发现大部分都是0,还有四舍五入造成的负数,只有前15个是大于10^5信息量很大



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kelisita

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值