今天看了用主成分分析简化数据,就顺便用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)) #
print(type(labels)) #
print(imgs.shape) # (55000, 784)
print(labels.shape) # (55000,)
取前