PCA和NMF

Python017

PCA和NMF,第1张

以 sklearn.datasets 的 load_wine 酒数据为例,将数据特征降维到2维,并可视化降维后的数据集,还给出原始特征与PCA主成分之间的关系。

注释1:

注释2:

执行结果为:

在之前的帖子中,为了可视化红酒数据,总是只取前2个特征,砍掉其余,其实是不科学的,现在使用PCA之后,将数据特征降维至二维,轻松实现可视化,又不会丢失太多信息

主成分与各特征值之间的关系

在上图中,颜色由深至浅代表一个从 -0.5~0.4的数值,在两个主成分中,分贝涉及了13个特征,如果某个特征对应的数字是正数,说明它和主成分之间是正相关的关系,如果是负数则相反。

使用 LFW人脸识别数据。LFW 人脸识别数据集包含了若干张JPEG图片,是从网站上搜集的一些名人的照片,每张照片都是一个人的脸部。这个数据集最初创建是为了训练机器学习算法,看给出两张照片,算法能否判断出这两个人是否是同一个人;后来,对机器学习提出了更高的要求,给出一张不在数据集里的照片,让机器判断这张照片书否属于该数据集中的某一个人,并叫出TA的名字。

接下来,使用该数据集,在数据未经处理的情况下,训练一个神经网络;再使用PCA中的数据白化功能处理人脸数据集,再训练神经网络模型,对比结果

执行结果为:

LFW人脸数据集中的部分照片如下图所示:

从结果可以看到。模型的准确率轻微的提高了一些,说明PCA 的白化功能对提高神经网络的准确率是有一定的帮助的。

NMF(Non-Negative Matrix Factorization)非负矩阵分解,是一个无监督学习,原始的矩阵中的所有数值必须大于或者等于0,分解之后的矩阵中的数据也是大于或者等于0的,简单理解为, NMF 是在

一堆特征值混乱无序的堆放空间中,从坐标原点出(0,0)出发引出一个或者几个向量,用这些向量,尽可能的把原始特征的信息表达出来。

与PCA的不同:

1.如果我们降低NMF的成分数量,它会生成新的成分,而新的成分和原来的成分是完全不一样的。

2.NMF中的成分是无序的,这点和PCA是不同的。

以下用NMF对LFW人脸数据集进行特征提取,再重新训练神经网络模型,对比查看结果。

执行结果如下:

可见,进过NMF 处理后的数据训练的神经网络模型准确率和PCA处理后的模型准确率基本持平。

学习文档: https://cran.r-project.org/web/packages/NMF/vignettes/heatmaps.pdf

NMF包中的热图引擎是由 aheatmap 函数实现,其余的热图函数都是基于它的修改。而 aheatmap 函数本身又是 pheatmap 包 pheatmap 函数的修改版本。引擎具体的优点作者有在文档是写,我就不唠叨了。

为了演示热图函数的用法,我们这里创建一个随机的NMF输入矩阵,以及一些注释和协变量。

查看下生成的注释数据:

这里 X 实际是一个矩阵, rdata 是行注释, covariates 是列注释。

下面画图:

接着,我们使用NMF模型来分解矩阵。

NMF结果的混合系数矩阵可以使用 coefmap() 函数进行绘制。该函数默认添加2个注释通道用来展示 从最佳拟合结果中获得的簇(聚类数)和一致性矩阵的层次聚类 。在图例中,这两个通道分别以 basis 和 consensus 命名。对于一个简单的NMF模型结果,一致性数据是不能显示的,只能通过最佳拟合进行聚类。

默认情况下:

如果想让 coefmap() 显示 aheatmap() 函数的默认形式,设置 Rowv=TRUE, Colv=TRUE, scale='none' 。

自动注释的通道可以使用 tracks=NA 进行隐藏,或者设置一个( tracks=':basis' 或 tracks='basis:' 可以分别设置行注释或列注释),图例名可以以 tracks=c(Metagene=':basis', 'consensus') 的形式进行修改。除此之外,利用 annCol 参数可以添加用户设定的手动注释。

基底矩阵可以使用 basismap 函数进行绘制,默认的行为是添加basis注释通道,每一行显示主导的基底组分,即每一行有最高负载的基底组分。

默认情况下:

当使用NMF进行矩阵的时候,一种评估基于指定rank评估聚类稳定性的方法是考虑由多个独立NMF运行结果计算得到的连接矩阵。有篇 不错的中文博文 讲的比较清晰,建议看看。

我们所用数据 res 设定的参数是 nrun=10 ,因此包含了10次运行得到的最佳结果以及基于所有运行的一致性矩阵。

很显然这是一个对称矩阵,结果看上一半或者下一半都可以。

函数 nmf 可以接受一组 rank 序列用来拟合多个不同的rank的结果。

然后可以同样的画图

可以比较同一rank不同方法的结果。

还有很多自定义画热图的例子,使用下面的命令查看。

本文简单介绍非负矩阵分解 —— Non-negative Matrix Factorization (NMF)以及它与Principal Component Analysis (PCA)的区别。

在学习机器学习基础和计算机视觉时,PCA的通俗解释及例子在网上很容易就能找到,但NMF的却寥寥无几。于是想写一篇关于NMF的简短的文章,便于跟我当初一样在初学时对于NMF的理解不是很清楚的朋友。

有错误的地方还望指正。

NMF是指通过将非负的数据矩阵,分解成两个小的矩阵的乘积,从而减少运算量。

X ≈ B×W(这里还需要注意的是,B和W矩阵并不是唯一的)

其中,X是数据集矩阵,是一个n×p的矩阵,每一列表示一个特征,共有p个特征;X是一个n×k的矩阵,理解为k个基;W是k×p的矩阵,每列均为数据集X投影到B上得到的向量。

以人脸处理这个实例来说,假设每张照片的人脸共有1000个特征:

在PCA处理中,将特征降维为600个,降维后的每个人脸都包含了600个特征(所以我们看到降维后的人脸有种“伏地魔”的感觉 (--.--||)),这是因为降维处理相当于删去了部分细节特征,导致一部分信息丢失,在图片中最直观的体现就是变模糊。

而在NMF的处理中,这1000个特征相当于是被分离了。数据矩阵X被拆分成基础向量B(basis vectors)与权重W(weights)的乘积:

X ≈ B × W

其中,权重W理解为特征的权重,如鼻子、耳朵、嘴巴等等。也就是说:

X ≈ B × w1 + B × w2 + …… + B × w1000

相当于,一张人脸是由鼻子、耳朵等这些独立的特征叠加出来的。

总的来说,PCA处理的人脸没有区分具体哪个特征对应哪些部位,而是统一地把所有的特征体现在一张照片上;NMF是一种“可加”的思想,不同的特征对应不同的脸部细节,将这些细节叠加形成一张脸。

https://www.youtube.com/watch?v=AN6QOmWPD60&t=253s