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

原创 2018年04月16日 09:41:23

一. 问题分析

采用机器学习算法对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(主成分分析)降维


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


使用PCA + KNN对MNIST数据集进行手写数字识别 python

第一步 从官网 http://yann.lecun.com/exdb/mnist/ 下载MNIST 数据库 然后解压缩 第二步 读入数据并测试  借鉴博客[1] 下载的文件为二进制文件 格式如下 ...
  • u010918541
  • u010918541
  • 2017-03-24 22:31:21
  • 1357

Matlab实现手写数字识别(PCA+KNN)

PCA降维的个人学习笔记
  • sky247391475
  • sky247391475
  • 2016-06-18 17:14:33
  • 5875

手写数字识别——数据降维(PCA)技术在图像识别中的应用

数据降维处理; 手写数字识别;
  • weixin_38748717
  • weixin_38748717
  • 2017-12-19 21:12:52
  • 338

基于SVM和KNN的手写数字的识别(分类)——小试牛刀篇

数据下载地址:http://download.csdn.net/detail/zhulf0804/9719836 这里采用的是k近邻算法(KNN)实现的手写数字识别。 python实现代码: # -*...
  • zhulf0804
  • zhulf0804
  • 2016-12-23 20:03:16
  • 1727

SVM和Knn实现手写数字识别

数据和程序下载地址:手写数字识别 调用SVM库实现数字识别# Standard scientific Python imports import matplotlib.pyplot as plt i...
  • NNNNNNNNNNNNY
  • NNNNNNNNNNNNY
  • 2017-01-06 23:04:10
  • 1575

pca+svm手写数字识别

在上一篇博客里讲到在matlab中使用libsvm识别手写数字,识别精度不高,一是svm的参数没有设置好,二是在提取图像特征时,直接将图像展开为一行,没有做任何处理,导致其训练速度和识别精度都不够好,...
  • baidu_30028771
  • baidu_30028771
  • 2017-05-06 21:43:55
  • 822

PCA + KNN 手写数字识别

KNN的原理可参考博客: https://www.cnblogs.com/21207-iHome/p/6084670.html 本文采用PCA+KNN的方法进行手写数字识别,训练数据来...
  • qq_27668313
  • qq_27668313
  • 2018-01-06 17:41:01
  • 75

OPENCV实现PCA+SVM

最近在做人脸识别,得到特征向量以后想要再做PCA降维,降维后的结果作为SVM训练的字典。在做PCA降维的过程中遇到一些问题,希望看到的大牛帮忙解决一下,有兴趣的朋友也可以帮忙看看是哪里有问题。    ...
  • maomao1011120756
  • maomao1011120756
  • 2015-10-14 16:08:20
  • 1002

OPENCV实现PCA降维中的GENN函数说明

刚使用OpenCV不就,最近在做关于行人检测方面的项目,使用HOG+SVM的方法实现,但是由于维数过高,致使处理时间过长,达不到实时检测的要求,因此选择了对HOG检测子进行了降维。在使用PCA降维的过...
  • maque351081953
  • maque351081953
  • 2016-10-25 14:24:04
  • 482

kNN和MDS降维

kNN和MDS降维
  • PKU_ZZY
  • PKU_ZZY
  • 2017-08-23 19:54:44
  • 376
收藏助手
不良信息举报
您举报文章:KNN / SVM 手写数字识别-PCA降维
举报原因:
原因补充:

(最多只允许输入30个字)