非负矩阵分解(Non-negative Matrix Factorization, NMF)是一种用于将一个非负矩阵分解成两个较小的非负矩阵乘积
的数学方法,它在信号处理、计算机视觉、机器学习
等领域有广泛应用。
NMF的目标是找到两个非负矩阵U和V,使得它们的乘积UV尽可能接近原矩阵X,同时U和V的维数小于X的维数,以达到数据降维的目的。
非负矩阵分解的基本公式
给定一个非负的数据矩阵
X
∈
R
m
×
n
X∈R^{m×n}
X∈Rm×n,其中每一列代表一个数据点
,每一行代表一个特征维度
。NMF的任务是寻找两个非负矩阵
U
∈
R
m
×
k
U∈R^{m×k}
U∈Rm×k 和
V
∈
R
k
×
n
V∈R^{k×n}
V∈Rk×n,使得:
X ≈ U V X ≈ UV X≈UV
这里,
k
<
m
i
n
(
m
,
n
)
k < min(m, n)
k<min(m,n),
U
U
U 被称为基矩阵
(Basic Matrix),
V
V
V 被称为编码矩阵
(Encoding Matrix)。
编码矩阵
V
V
V 的每一列表示对应原始数据点在基矩阵U下的低维表示
。
NMF通过最小化重构误差
来逼近原始矩阵,常见的损失函数为均方误差
:
J N M F = ∣ ∣ X − U V ∣ ∣ F 2 J_{NMF} = ||X - UV||^2_F JNMF=∣∣X−UV∣∣F2
其中
- (X) 是
非负数据矩阵。
- (U) 和 (V) 分别是
基矩阵
和编码矩阵
。 -
∣
∣
⋅
∣
∣
F
||·||_F
∣∣⋅∣∣F 表示矩阵的Frobenius范数。
约束条件是U和V的所有元素都大于等于0。
-
∣
∣
X
−
U
V
∣
∣
F
2
||X - UV||^2_F
∣∣X−UV∣∣F2 是
重构误差项
非负矩阵分解的优化
目标函数 J_NMF 相对于
U
U
U 和
V
V
V 同时是非凸的
,但当其中一个固定时
,它是凸的
。因此,通常使用迭代乘子更新规则来优化U和V:
U t + 1 = U t ⊙ ( X V t T ) ( U t V V t T ) U^{t+1} = U^t \odot \frac{(XV^{tT})}{(U^tVV^{tT})} Ut+1=Ut⊙(UtVVtT)(XVtT)
V t + 1 = V t ⊙ ( U t + 1 T X ) ( U t + 1 T U t + 1 V t ) V^{t+1} = V^t \odot \frac{(U^{t+1T}X)}{(U^{t+1T}U^{t+1}V^t)} Vt+1=Vt⊙(Ut+1TUt+1Vt)(Ut+1TX)
其中:
- U t U^t Ut 表示在第 t t t 次迭代时矩阵 U U U 的状态
- U t T U^{tT} UtT 表示在第 t t t 次迭代时矩阵 U U U 的状态的装置
- U t + 1 U^{t+1} Ut+1 是基于 U t U^t Ut 和 V t V^t Vt 的值更新得到的下一步迭代步的矩阵 U U U 的值
- V t V^t Vt 表示在第 t t t 次迭代时矩阵 V V V 的状态
- V t T V^{tT} VtT 表示在第 t t t 次迭代时矩阵 V V V 的状态的装置
-
V
t
+
1
V^{t+1}
Vt+1 是基于
U
t
U^t
Ut 和
V
t
V^t
Vt 的值更新得到的下一步迭代步的矩阵
V
V
V 的值
这里的符号“⊙”表示Hadamard积,即元素按位置相乘
。
举例说明
假设有一个非负的数据矩阵X,大小为3x5,表示三个特征维度
下的五个数据点:
X = [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] X = \begin{bmatrix} 1 & 2 & 3 & 4 & 5 \\ 6 & 7 & 8 & 9 & 10 \\ 11 & 12 & 13 & 14 & 15 \end{bmatrix} X= 161127123813491451015
我们的目标是找到两个非负矩阵U和V
,使得UV可以近似X
,假设k=2。通过NMF算法,我们可能得到:
U = [ 0.5 0.2 1.5 0.7 2.5 1.2 ] , V = [ 2 4 6 8 10 1 1 1 1 1 ] U = \begin{bmatrix} 0.5 & 0.2 \\ 1.5 & 0.7 \\ 2.5 & 1.2 \end{bmatrix}, \quad V = \begin{bmatrix} 2 & 4 & 6 & 8 & 10 \\ 1 & 1 & 1 & 1 & 1 \end{bmatrix} U= 0.51.52.50.20.71.2 ,V=[21416181101]
然后UV的结果为:
U V = [ 0.5 ∗ 2 + 0.2 ∗ 1 . . . . . . 1.5 ∗ 2 + 0.7 ∗ 1 . . . . . . 2.5 ∗ 2 + 1.2 ∗ 1 . . . . . . ] UV = \begin{bmatrix} 0.5*2 + 0.2*1 & ... & ... \\ 1.5*2 + 0.7*1 & ... & ... \\ 2.5*2 + 1.2*1 & ... & ... \end{bmatrix} UV= 0.5∗2+0.2∗11.5∗2+0.7∗12.5∗2+1.2∗1..................
这个结果会尽量接近X。通过调整U和V
,我们能够找到一个较好的低维表示,同时保留原始数据的特征。这种低维表示有助于数据可视化、降维和后续的机器学习任务
。