主成分分析降维(MNIST数据集)

北京 | 高性能计算之GPU CUDA课程11月24-26日 3天密集学习 快速带你晋级 阅读全文 >


刘凯欣,中国矿业大学在校学生,曾参加过ThoughtWorks举办的结对编程活动。


今天看了用主成分分析简化数据,就顺便用MNIST数据集做了下实验,想直观地看一下效果,并通过完成这个小demo深入理解下原理。


我发现“是什么、能做什么、怎么用、效果是什么、原理是什么、优缺点是什么”这样的思路能让我更好地接受一个新知识,之所以把原理放在效果后面,是因为我比较喜欢先看看它的作用,可视化意义之后能提起我对一个知识的兴趣,加深对它意义的理解,后面看数学原理会容易,所以整篇文章就以这样的思路组织整理。


主成分分析是什么


主成分分析(Principal Component Analysis,PCA),一种降维方法,在PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系由数据本身决定,在新坐标系中,第一个坐标轴选择的是原始数据中方差最大的方向,第二个坐标轴选择的是和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理。


初看这段话感觉是抽象的。方差大意味着什么?方差是衡量源数据和期望值相差的度量值,方差越大,数据差别越大。选择方差最大的方向,就是选择数据差别最大的方向。重复特征数目次,就是说找第一个特征(第一维)方差最大的方向(即覆盖数据点最多的一条直线),做第一个轴,正交且最大方差方向做第二个轴,在此基础上再看第二个特征(第二维),找方差最大方向做第一个轴,正交且最大方差方向做第二个轴,依次类推。这样执行后会发现前几个坐标轴已经差不多囊括所有大差异了,剩下的就不要了,所以实现了降维。


上面从理论上讲了主成分分析和它是如何一步一步实现降维的,有一个感性认识。


主成分分析能做什么


降维,在多个指标中只取重要的几个指标,能使复杂问题简单化,就像说话说重点一样。


主成分分析怎么用


要做的事就是使用tensorflow里的MNIST数据集,取前100张图片中所有的手写数字7图片,对他们进行主成分分析,输出经过降维反变换回去的图片,对比差异,看看降维后的效果。


引入MNIST数据集、numpy和PIL的Image


import tensorflow.examples.tutorials.mnist.input_data as input_data import numpy as np from PIL import Image


获得MNIST数据集的所有图片和标签


mnist = input_data.read_data_sets("MNIST_data/", one_hot=False)
imgs = mnist.train.images
labels = mnist.train.labels

这里可以看看imgs和labels的type和shape,对于一个python初学者来说总是想搞清楚各个变量的类型和长相。

print(type(imgs))             # <type 'numpy.ndarray'>
print(type(labels))           # <type 'numpy.ndarray'>
print(imgs.shape)             # (55000, 784)
print(labels.shape)           # (55000,)


取前1000张图片里的100个数字7


origin_7_imgs = [] for i in range(1000):    
if labels[i] == 7 and len(origin_7_imgs) < 100:        
origin_7_imgs.append(imgs[i])

看看shape

print(np.array(origin_7_imgs).shape)   # (100, 784)


把10张图片排成2x5的表格


由于一张图片是一个784维的一维数组,变成我们想看的图片就需要把它reshape成28x28的二维数组,然后再用Image里的方法,把它拼成一张2x5的大图。


由于tensorflow中MNIST都是灰度图(L),所以shape是(55000,784),每张图的dtype是float32,如果是彩色图(RGB),shape可能是(55000,784,3),图的dtype是uint8,从array转到Image需要用下面的方法:


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值