对于任意给定的一个非负矩阵V,NMF算法能够通过计算,从原矩阵提取权重矩阵和特征矩阵两个不同的矩阵出来。(限制条件:W和H中的所有元素都要大于0)
注:
W: 权重矩阵(字典矩阵)
H: 特征矩阵(扩展矩阵)
V: 原矩阵
网上流传一种很有利的解释就是非负为了使数据有效,负数对于数据是无效的。个人认为取非负元素主要是运用于实际问题中。例如图像数据中不可能有负值的像素点,文本数据采用二进制表示…
从上面的模型中,很容易发现:当N、M特别大时,原矩阵面积V远大于权重矩阵W和特征矩阵H的和,也就是n*m>>(n+m)*r。因此如果用W+H代替V来存储或读取,能很大程度上节约存储空间或大大提高读取速度。
当然,讲到这里NMF好像很简单,只是对矩阵进行分解。不过仔细想想如果只是简单对矩阵进行分解早就被人提出来引用了,正是因为如何分解矩阵才能更好地对矩阵进行解析,也就是如何解NMF矩阵本身就是一个难题,因此还有很多问题值得我们一起去探讨的,接下来具体介绍下算法实现。
NMF求解问题实际上是一个最优化问题,利用乘性迭代的方法求解和,非负矩阵分解是一个NP问题。NMF问题的目标函数有很多种,应用最广泛的就是欧几里得距离和KL散度。由于W与H的乘积是对V的近似估计,所以评价分解好坏的标准便是两者之间的差异。
在 N M F 的 分 解 问 题 中 , 假 设 噪 声 矩 阵 为 E ∈ R n ∗ m , 那 么 有 E = V − W H 。 在NMF的分解问题中,假设噪声矩阵为E\in R^{n\ast m},那么有E=V-WH。 在NMF的分解问题中,假设噪声矩阵为E∈Rn∗m,那么有E=V−WH。现在要找出合适的W和H使得||E||最小。
假设噪声服从不同的概率分布,通过最大似然函数会得到不同类型的目标函数。
噪声服从高斯分布
假设噪声服从高斯分布,也称作为平方距离。
平方距离定义:
∥ A − B ∥ 2 = ∑ i , j ( A i , j − B i , j ) 2 \left \| A-B \right \|^{2} = \sum_{i,j}\left ( A_{i,j}-B_{i,j} \right )^{2} ∥A−B∥2=i,j∑(Ai,j−Bi,j)2
step1:得到最大似然函数L(W,H)为
L ( W , H ) = ∏ i , j 1 2 π σ i j e − E i j 2 2 σ i j = ∏ i , j 1 2 π σ i j e − [ V i j − ( W H ) i j ] 2 2 σ i j L(W,H) =\prod_{i,j}\frac{1}{\sqrt{2\pi} \sigma _{ij}}e^{-\frac{E_{ij}^{2}}{2 \sigma _{ij}}}=\prod_{i,j}\frac{1}{\sqrt{2\pi} \sigma _{ij}}e^{-\frac{[V_{ij}-(WH)_{ij}]^{2}}{2 \sigma _{ij}}} L(W,H)=i,j∏2πσij1e−2σijEij2=i,j∏2πσij1e−2σij[Vij−(WH)ij]2
step2:两边取对数,得到对数似然函数lnL(W,H)
l n L ( W , H ) = ∑ i , j ( l n 1 2 π σ i j − [ V i j − ( W H ) i j ] 2 2 σ i j ) = ∑ i , j l n 1 2 π σ i j − 1 σ i j . 1 2 ∑ i , j [ V i j − ( W H ) i j ] 2 lnL(W,H) =\sum_{i,j}(ln \frac{1}{\sqrt{2\pi}\sigma _{ij}}-\frac{[V_{ij}-(WH)_{ij}]^{2}}{2 \sigma _{ij}})=\sum_{i,j}ln \frac{1}{\sqrt{2\pi}\sigma _{ij}}- \frac{1}{ \sigma _{ij}}.\frac{1}{2}\sum_{i,j}[V_{ij}-(WH)_{ij}]^{2} lnL(W,H)=i,j∑(ln2πσij1−2σij[Vij−(WH)ij]2)=i,j∑ln2πσij1−σij1.21i,j∑[Vij−(WH)ij]2
step3:假设各数据点噪声的标准差σ一样,那么接下来要使得对数似然函数lnL(W,H) 取值最大,只需要下面目标函数J(W,H)值最小
J ( W , H ) = 1 2 ∑ i , j [ V i j − ( W H ) i j ] 2 J(W,H) = \frac{1}{2}\sum_{i,j}[V_{ij}-(WH)_{ij}]^{2} J(W,H)=21i,j∑[Vij−(WH)ij]2
该函数是基于欧几里得距离的度量
( W H ) i j = ∑ k W i k H k j ⇒ ∂ ( W H ) i j ∂ W i k = H k j ( W H ) i j = ∑ k W i k H k j ⇒ ∂ ( W H ) i j ∂ H k j = W i k (WH)_{ij} = \sum_{k}W_{ik}H_{kj}\Rightarrow \frac{\partial(WH)_{ij}}{\partial W_{ik}}=H_{kj}\\ (WH)_{ij} = \sum_{k}W_{ik}H_{kj}\Rightarrow \frac{\partial(WH)_{ij}}{\partial H_{kj}}=W_{ik} (WH)ij=k∑WikHkj⇒∂Wik∂(WH)ij=Hkj(WH)ij=k∑WikHkj⇒∂Hkj∂(WH)ij=Wik
step4:目标函数J(W,H)求偏导
∂ J ( W , H ) ∂ W i k = ∑ i , j [ H k j ( V i j − ( W H ) i j ) ] = ∑ i , j [ V i j H k j − ( W H ) i j H k j ] = ∑ i , j [ V i j H j k T − ( W H ) i j H j k T ] = ( V H T ) i k − ( W H H T ) i k \frac{\partial J(W,H)}{\partial W_{ik}}= \sum_{i,j}[H_{kj}(V_{ij}-(WH)_{ij})] =\sum_{i,j}[V_{ij}H_{kj}-(WH)_{ij}H_{kj}]\\ =\sum_{i,j}[V_{ij}H_{jk}^{T}-(WH)_{ij}H_{jk}^{T}] = (VH^{T})_{ik}-(WHH^{T})_{ik} ∂Wik∂J(W,H)=i,j∑[Hkj(Vij−(WH)ij)]=i,j∑[VijHkj−(WH)ijHkj]=i,j∑[VijHjkT−(WH)ijHjkT]=(VHT)ik−(WHHT)ik
同理
∂ J ( W , H ) ∂ H k j = ∑ i , j [ W i k ( V i j − ( W H ) i j ) ] = ∑ i , j [ W i k V i j − W i k ( W H ) i j ] = ∑ i , j [ W k i T V i j − W k i T ( W H ) i j ] = ( W T V ) k j − ( W T W H ) k j \frac{\partial J(W,H)}{\partial H_{kj}}=\sum_{i,j}[W_{ik}(V_{ij}-(WH)_{ij})]= \sum_{i,j}[W_{ik}V_{ij}-W_{ik}(WH)_{ij}]\\ =\sum_{i,j}[W_{ki}^{T}V_{ij}-W_{ki}^{T}(WH)_{ij}] = (W^{T}V)_{kj}-(W^{T}WH)_{kj} ∂Hkj∂J(W,H)=i,j∑[Wik(Vij−(WH)ij)]=i,j∑[WikVij−Wik(WH)ij]=i,j∑[WkiTVij−WkiT(WH)ij]=(WTV)kj−(WTWH)kj
step5:使用梯度下降进行迭代
W i k = W i k + α 1 [ ( V H T ) i k − ( W H H T ) i k ] H k j = H k j + α 2 [ ( W T V ) k j − ( W T W H ) k j ] W_{ik}=W_{ik}+\alpha _{1}[(VH^{T})_{ik}-(WHH^{T})_{ik}]\\ H_{kj}=H_{kj}+\alpha _{2}[(W^{T}V)_{kj}-(W^{T}WH)_{kj}] Wik=Wik+α1[(VHT)ik−(WHHT)ik]Hkj=Hkj+α2[(WTV)kj−(WTWH)kj]
step5:选取合适的α,得到最终迭代式
α 1 = W i k ( W H H T ) i k α 2 = H k j ( W T W H ) k j \alpha _{1} = \frac{W_{ik}}{(WHH^{T})_{ik}} \qquad \alpha _{2} = \frac{H_{kj}}{(W^{T}WH)_{kj}} α1=(WHHT)ikWikα2=(WTWH)kjHkj
W i k = W i k ( V H T ) i k ( W H H T ) i k ① H k j = H k j ( W T V ) k j ( W T W H ) k j ② W_{ik}=W_{ik}\frac{(VH^{T})_{ik}}{(WHH^{T})_{ik}}① \qquad H_{kj}=H_{kj}\frac{(W^{T}V)_{kj}}{(W^{T}WH)_{kj}}② Wik=Wik(WHHT)ik(VHT)ik①Hkj=Hkj(WTWH)kj(WTV)kj②
可看出这是乘性迭代规则,每一步都保证了结果为正数。
噪声服从泊松分布
假设噪声服从泊松分布,也称作为KL散度。
step1:KL散度并不是那么的直观,下面画图来理解下。首先说明一点:KL散度是非对称的。
从图中很容易写出解的切线方程,其实如果接近,这就是一阶Taylor近似,写成更一般的形式:
f ( y ) ≈ f ( x ) − △ f ( x ) ( x − y ) f(y)\approx f(x)-\triangle f(x)(x-y) f(y)≈f(x)−△f(x)(x−y)
step2:推广开来这就是Bregman距离:
令 : D → R 为 定 义 在 闭 合 凸 集 D ⊆ D ⊆ R + k 的 一 连 续 可 微 分 凸 函 数 。 − − 与 函 数 对 应 的 两 个 向 量 x , y ∈ D 之 间 的 B r e g m a n 距 离 记 作 : B φ ( x ∣ ∣ y ) = φ ( y ) − φ ( x ) + ⟨ △ φ ( x ) , x − y ⟩ 令:D\rightarrow R为定义在闭合凸集D\subseteq D\subseteq R_{+}^{k}的一连续可微分凸函数。\\ - - \\ 与函数对应的两个向量x,y\in D之间的Bregman距离记作:B_{\varphi}(x||y)=\varphi(y)-\varphi(x) + \langle \triangle \varphi(x),x-y\rangle \\ 令:D→R为定义在闭合凸集D⊆D⊆R+k的一连续可微分凸函数。−−与函数对应的两个向量x,y∈D之间的Bregman距离记作:Bφ(x∣∣y)=φ(y)−φ(x)+⟨△φ(x),x−y⟩
step3:如果凸函数:
φ ( x ) = ∑ i = 1 k x i l n x i \varphi(x)=\sum_{i=1}^{k}x_{i}lnx_{i} φ(x)=i=1∑kxilnxi
可以得到
B φ ( x ∣ ∣ y ) = ∑ i = 1 k [ y i l n x i − x i l n x i + ( l n x i + 1 ) ( x i − y i ) ] = ∑ i = 1 k ( y i l n x i y i − x i + y i ) B_{\varphi}(x||y)=\sum_{i=1}^{k}[y_{i}lnx_{i}-x_{i}lnx_{i}+(lnx_{i}+1)(x_{i}-y_{i})] =\sum_{i=1}^{k}(y_{i}ln\frac{x_{i}}{y_{i}}-x_{i}+y_{i}) Bφ(x∣∣y)=i=1∑k[yilnxi−xilnxi+(lnxi+1)(xi−yi)]=i=1∑k(yilnyixi−xi+yi)
step4:所以通过KL散度定义的损失函数为:
D ( A ∣ ∣ B ) = ∑ i , j ( V i j l n V i j ( W H ) i j − V i j + ( W H ) i j ) D(A||B) = \sum_{i,j} (V_{ij}ln\frac{V_{ij}}{(WH)_{ij}}-V_{ij}+(WH)_{ij}) D(A∣∣B)=i,j∑(Vijln(WH)ijVij−Vij+(WH)ij)
在KL散度的定义中,D(A∥B)⩾0,当且仅当A=B时取得等号。
此步证明可参考:https://blog.csdn.net/cumttzh/article/details/79790953
step5:目标函数J(W,H)求偏导
∂ J ( W , H ) ∂ W i k = ∑ i , j ( H k j − V i j H k j ( W H ) i j ) = ∑ i , j ( H k j − V i j H k j ( W H ) i j ) \frac{\partial J(W,H)}{\partial W_{ik}} = \sum_{i,j}(H_{kj}-V_{ij}\frac{H_{kj}}{(WH)_{ij}}) =\sum_{i,j}(H_{kj}-\frac{V_{ij}H_{kj}}{(WH)_{ij}}) ∂Wik∂J(W,H)=i,j∑(Hkj−Vij(WH)ijHkj)=i,j∑(Hkj−(WH)ijVijHkj)
同理:
∂ J ( W , H ) ∂ H k j = ∑ i , j ( W i k − V i j W i k ( W H ) i j ) = ∑ i , j ( W i k − V i j W i k ( W H ) i j ) \frac{\partial J(W,H)}{\partial H_{kj}} = \sum_{i,j}(W_{ik}-V_{ij}\frac{W_{i k}}{(WH)_{ij}}) =\sum_{i,j}(W_{ik}-\frac{V_{ij}W_{ik}}{(WH)_{ij}}) ∂Hkj∂J(W,H)=i,j∑(Wik−Vij(WH)ijWik)=i,j∑(Wik−(WH)ijVijWik)
step6:使用梯度下降进行迭代
W i k = W i k + α 1 ∑ i , j ( H k j − V i j H k j ( W H ) i j ) − − H k j = H k j + α 2 ∑ i , j ( W i k − V i j W i k ( W H ) i j ) W_{ik}=W_{ik}+\alpha _{1}\sum_{i,j}(H_{kj}-\frac{V_{ij}H_{kj}}{(WH)_{ij}})\\--\\ H_{kj}=H_{kj}+\alpha _{2}\sum_{i,j}(W_{ik}-\frac{V_{ij}W_{ik}}{(WH)_{ij}}) Wik=Wik+α1i,j∑(Hkj−(WH)ijVijHkj)−−Hkj=Hkj+α2i,j∑(Wik−(WH)ijVijWik)
step7:选取合适的α,得到最终迭代式
α 1 = W i k ∑ i , j ( W H ) i j V i j H k j α 2 = H k j ∑ i , j ( W H ) i j V i j W i k \alpha _{1} = W_{ik}\sum_{i,j}\frac{(WH)_{ij}}{V_{ij}H_{kj}} \qquad \alpha _{2} =H_{kj}\sum_{i,j}\frac{(WH)_{ij}}{V_{ij}W_{ik}} α1=Wiki,j∑VijHkj(WH)ijα2=Hkji,j∑VijWik(WH)ij
W i k = W i k ∑ j H k j ∑ i , j ( W H ) i j V i j H k j ③ H k j = H k j α 2 ∑ i H i k ∑ i , j ( W H ) i j V i j W i k ④ W_{ik}=W_{ik}\sum_{j}H_{kj}\sum_{i,j}\frac{(WH)_{ij}}{V_{ij}H_{kj}}③ \qquad H_{kj}=H_{kj}\alpha _{2}\sum_{i}H_{ik}\sum_{i,j}\frac{(WH)_{ij}}{V_{ij}W_{ik}} ④ Wik=Wikj∑Hkji,j∑VijHkj(WH)ij③Hkj=Hkjα2i∑Hiki,j∑VijWik(WH)ij④
W i k = W i k ( V H T ) i k ( W H H T ) i k ① H k j = H k j ( W T V ) k j ( W T W H ) k j ② W_{ik}=W_{ik}\frac{(VH^{T})_{ik}}{(WHH^{T})_{ik}}① \qquad H_{kj}=H_{kj}\frac{(W^{T}V)_{kj}}{(W^{T}WH)_{kj}}② Wik=Wik(WHHT)ik(VHT)ik①Hkj=Hkj(WTWH)kj(WTV)kj②
W i k = W i k ∑ j H k j ∑ i , j ( W H ) i j V i j H k j ③ H k j = H k j α 2 ∑ i H i k ∑ i , j ( W H ) i j V i j W i k ④ W_{ik}=W_{ik}\sum_{j}H_{kj}\sum_{i,j}\frac{(WH)_{ij}}{V_{ij}H_{kj}}③ \qquad H_{kj}=H_{kj}\alpha _{2}\sum_{i}H_{ik}\sum_{i,j}\frac{(WH)_{ij}}{V_{ij}W_{ik}} ④ Wik=Wikj∑Hkji,j∑VijHkj(WH)ij③Hkj=Hkjα2i∑Hiki,j∑VijWik(WH)ij④
1)随机生成一个W矩阵;
2)固定H,按照公式①迭代更新W直到收敛(W不变或变化很小)
3)固定W,按照公式②迭代更新H直到收敛(H不变或变化很小)
4)重复2)、3)步骤直到对应的损失函数不变或变化很小
1)随机生成一个W矩阵;
2)固定H,按照公式③迭代更新W直到收敛(W不变或变化很小)
3)固定W,按照公式④迭代更新H直到收敛(H不变或变化很小)
4)重复2)、3)步骤直到对应的损失函数不变或变化很小
输入参数:X,R,MATRIX
============> X为被分解的矩阵
============> R为降阶后W的秩
============> MATRIX为迭代次数
输出参数:W,H
1):初始化矩阵W,H为非负数,同时对W的每一列数据归一化
2):for i=1:MAXITER
a:更新矩阵H的一行元素:H(i,k)=H(i,j)×(W’×X)(i,j)/(W’×W×H)(k,j)
b:更新矩阵W的一列元素:W(k,j)=W(k,j)×(X×H’)(k,j)/(W×H×H’)(i,k);
c: 重新对B进行列归一化
3)end