徒手写代码之《机器学习实战》----PCA算法(1)(利用PCA对半导体制造数据降维)

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

说明:

secom.data 放在当前目录下。

from numpy import *
import numpy as np

PCA 算法

def pca(dataMat, topNfeat=9999999):
    #计算均值
    meanVals = dataMat.mean(0)
    #去均值化,均值变为0
    meanRemoved = dataMat - meanVals #remove 
    #计算协方差矩阵
    covMat = cov(meanRemoved, rowvar=0)
    #计算协方差矩阵的特征值和特征向量
    eigVals,eigVects = linalg.eig(mat(covMat))
    #对特征值排序,argsort函数默认是从小到大排序的,返回对应的索引值
    eigValInd = argsort(eigVals)            #sort, sort goes smallest to largest
    #提取出最大的N个特征对应的索引
    eigValInd = eigValInd[:-(topNfeat+1):-1]  #cut off unwanted dimensions
    #取出最大的N个特征所对应的N个特征向量
    redEigVects = eigVects[:,eigValInd]       #reorganize eig vects largest to smallest
    #降维后的数据
    lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions    
    #利用降维后的矩阵反构出原数据矩阵(用作测试,可以跟未压缩的原矩阵比对)
    reconMat = (lowDDataMat * redEigVects.T) + meanVals
    return lowDDataMat, reconMat

数据导入函数

def loadDataSet(fileName, delim='\t'):
    fr = open(fileName)
    stringArr = [line.strip().split(delim) for line in fr.readlines()]
    datArr = [list(map(float,line)) for line in stringArr]
    return mat(datArr)

导入数据,将 NaN 替换成平均值

def replaceNanWithMean(): 
    datMat = loadDataSet('secom.data', ' ')
    numFeat = shape(datMat)[1]
    for i in range(numFeat):
        #剔除缺失值后的均值
        meanVal = mean(datMat[nonzero(~isnan(datMat[:,i].A))[0],i]) 
        #用均值填充缺失值
        datMat[nonzero(isnan(datMat[:,i].A))[0],i] = meanVal  #set NaN values to mean
    return datMat
dataMat = replaceNanWithMean()

数据预处理,减去均值

meanVals = mean(dataMat, 0)
meanRemoved = dataMat - meanVals

协方差与特征值分析

covMat = cov(meanRemoved, rowvar=0)
eigVals, eigVects = linalg.eig(mat(covMat))
print(eigVals); len(eigVals)

计算主成分所占方差比

import matplotlib.pyplot as plt

Var = eigVals
Var_sum = sum(Var)
Var_rate = Var/Var_sum
plt.plot(Var_rate[:20],'s-') # plot 20st
plt.show()

徒手写代码之《机器学习实战》----PCA算法(1)(利用PCA对半导体制造数据降维)_第1张图片

计算主成分累计方差百分比

Var = eigVals
Var_sum = sum(Var)
Var_add = zeros_like(Var)
for i in range(len(Var)):
    Var_add[i] = sum(Var[:i+1])/Var_sum
plt.plot(Var_add[:20],'s-') # plot 20st 
plt.show()

徒手写代码之《机器学习实战》----PCA算法(1)(利用PCA对半导体制造数据降维)_第2张图片

使用 PCA 降维,保留 6 个最大特征

lowDMat, reconMat = pca(dataMat, 6)
print(lowDMat.shape)
(1567, 6)
print(reconMat.shape)
(1567, 590)

你可能感兴趣的:(机器学习实战,个人总结,书籍)