NMF的基本思想可以简单描述为:

对于任意给定的一个非负矩阵V,NMF算法能够寻找到一个非负矩阵W和一个非负矩阵H,使得满足 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。如下图所示,其中要求分解后的矩阵H和W都必须是非负矩阵。

python nmf 非负矩阵分解 遇到负值怎么办 非负矩阵分解算法_矩阵分解


矩阵V分解为左矩阵W和右矩阵H,可理解为原始矩阵V的列向量是H中的所有列向量的加权和,对应的权重系数则是W的列向量的元素,所有H称为基矩阵,W称为系数矩阵。

NMF在人脸识别的应用中和PCA还有VQ分解不同。VQ分解是用一张完整的图像直接代表源脸部图像;PCA是将几个完整人脸加减压成一张脸;而NMF是取甲的眼睛,乙的鼻子,丙的嘴巴直接拼成一张脸,也就是说NMF分解后的基矩阵H是每张人脸的一个特征部分,例如眼睛,鼻子,嘴巴等,然后权重矩阵对这些特征进行加权处理从而得到一张完整的人脸。如下图所示3种矩阵分解方式的区别。

python nmf 非负矩阵分解 遇到负值怎么办 非负矩阵分解算法_算法_02

具体算法流程

非负矩阵分解中,代码采用的是原始论文中提及的基于乘法更新发展的迭代更新算法,其将矩阵分解算法转化为如下的优化问题,即最小化两个矩阵之间的欧几里得距离的优化问题:

python nmf 非负矩阵分解 遇到负值怎么办 非负矩阵分解算法_优化问题_03

其中V为原始矩阵,V’ 为分解后的矩阵重构而成的矩阵,即

python nmf 非负矩阵分解 遇到负值怎么办 非负矩阵分解算法_矩阵分解_04

,乘法更新规则如下:H矩阵的更新:

python nmf 非负矩阵分解 遇到负值怎么办 非负矩阵分解算法_矩阵_05

,其中

python nmf 非负矩阵分解 遇到负值怎么办 非负矩阵分解算法_算法_06

是指矩阵的第 α 行第 μ 列元素,当

python nmf 非负矩阵分解 遇到负值怎么办 非负矩阵分解算法_矩阵分解_07

时,对应位置元素不做更新。W矩阵的更新:

python nmf 非负矩阵分解 遇到负值怎么办 非负矩阵分解算法_矩阵分解_08

,其中 iα 是指矩阵的第 i 行第 α 列元素,当

python nmf 非负矩阵分解 遇到负值怎么办 非负矩阵分解算法_矩阵分解_09

时,对应位置元素不做更新。