KNN / SVM 手写数字识别-PCA降维

一. 问题分析

采用机器学习算法对usps和mnist两个数据集完成手写数字识别任务。

1.1. 数据集介绍

  • MNIST 

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)。训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员,测试集(test set) 也是同样比例的手写数字数据。训练数据集共包含 60,000 个样本。

  • USPS
美国邮政服务USPS手写数字识别库,库中均为16*16像素的灰度图像的值,灰度值已经被归一化。训练数据集共包含 4649 个样本。整个训练集是一个(4649, 256)维的矩阵。以数据集中前10条数据为例,把数据处理为图片输出,



PCA降维

降维技术使得数据集变得更容易使用,并且它们往往能够去除数据中的噪声,使得其他机器学习任务更加精确。降维往往作为预处理步骤,在数据应用到其他算法之前清洗数据。其中PCA(主成分分析)应用最广泛。PCA(主成分分析)可以从数据中识别主要特征,它是通过沿着数据最大方差旋转坐标轴来实现的。

主要步骤(保留前N个主成分):

a)  去除平均值

b)  计算协方差矩阵

c)  计算协方差矩阵的特征值和特征向量

d)  将特征值从大到小排序

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

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

代码:

def pca(self, dataMat, K=9999999):   # dataMat是原始数据,一个矩阵,K是要降到的维数  
      meanVals = mean(dataMat, axis=0)      # 第一步:求均值  
      meanRemoved = dataMat - meanVals      # 减去对应的均值  
      covMat = cov(meanRemoved, rowvar=0)   # 第二步,求特征协方差矩阵  
      eigVals, eigVects = linalg.eig(mat(covMat))   # 第三步,求特征值和特征向量  
      eigValInd = argsort(eigVals)     # 第四步,将特征值按照从小到大的顺序排序  
      eigValInd = eigValInd[: -(K+1): -1]        # 选择其中最大的K个  
      redEigVects = eigVects[:, eigValInd]       # 然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵.  
      lowDDataMat = meanRemoved * redEigVects    # 第五步,将样本点投影到选取的特征向量上,得到降维后的数据  
      reconMat = (lowDDataMat * redEigVects.T) + meanVals   # 还原数据  
      contribution = self.calc_single_contribute(eigVals, eigValInd)   # 计算单维贡献度,总贡献度为其和  
      return lowDDataMat, reconMat,contribution 

lowDDataMat 为降维后的数据。reconMat 为(还原后的)原始数据。





REFERENCE

1, 《机器学习实战》Peter Harrington 著.2017.8.

2,  python实现PCA(主成分分析)降维


---再回首,再更新----


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页