非负矩阵分解(NMF)
- NMF的基本思想
- 为什么分解的矩阵式非负?
- 为什么要运用非负矩阵分解?
- 非负矩阵分解的算法和实现
- 平方距离
- KL散度
- 平方距离
- KL散度
NMF的基本思想:
对于任意给定的一个非负矩阵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的近似估计,所以评价分解好坏的标准便是两者之间的差异。
两种损失函数的定义方式:
在NMF的分解问题中,假设噪声矩阵为E∈Rn∗m,那么有E=V−WH。现在要找出合适的W和H使得||E||最小。
假设噪声服从不同的概率分布,通过最大似然函数会得到不同类型的目标函数。
a. 平方距离
噪声服从高斯分布
假设噪声服从高斯分布,也称作为平方距离。
平方距离定义:
∥A−B∥2=i,j∑(Ai,j−Bi,j)2
step1:得到最大似然函数L(W,H)为
L(W,H)=i,j∏2πσij1e−2σijEij2=i,j∏2πσij1e−2σij[Vij−(WH)ij]2
step2:两边取对数,得到对数似然函数lnL(W,H)
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)=21i,j∑[Vij−(WH)ij]2
该函数是基于欧几里得距离的度量
(WH)ij=k∑WikHkj⇒∂Wik∂(WH)ij=Hkj(WH)ij=k∑WikHkj⇒∂Hkj∂(WH)ij=Wik
step4:目标函数J(W,H)求偏导
∂Wik∂J(W,H)=i,j∑[Hkj(Vij−(WH)ij)]=i,j∑[VijHkj−(WH)ijHkj]=i,j∑[VijHjkT−(WH)ijHjkT]=(VHT)ik−(WHHT)ik
同理
∂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:使用梯度下降进行迭代
Wik=Wik+α1[(VHT)ik−(WHHT)ik]Hkj=Hkj+α2[(WTV)kj−(WTWH)kj]
step5:选取合适的α,得到最终迭代式
α1=(WHHT)ikWikα2=(WTWH)kjHkj
Wik=Wik(WHHT)ik(VHT)ik①Hkj=Hkj(WTWH)kj(WTV)kj②
可看出这是乘性迭代规则,每一步都保证了结果为正数。
b. KL散度
噪声服从泊松分布
假设噪声服从泊松分布,也称作为KL散度。
step1:KL散度并不是那么的直观,下面画图来理解下。首先说明一点:KL散度是非对称的。
从图中很容易写出解的切线方程,其实如果接近,这就是一阶Taylor近似,写成更一般的形式:
f(y)≈f(x)−△f(x)(x−y)
step2:推广开来这就是Bregman距离:
令:D→R为定义在闭合凸集D⊆D⊆R+k的一连续可微分凸函数。−−与函数对应的两个向量x,y∈D之间的Bregman距离记作:Bφ(x∣∣y)=φ(y)−φ(x)+⟨△φ(x),x−y⟩
step3:如果凸函数:
φ(x)=i=1∑kxilnxi
可以得到
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∑(Vijln(WH)ijVij−Vij+(WH)ij)
在KL散度的定义中,D(A∥B)⩾0,当且仅当A=B时取得等号。
此步证明可参考:https://blog.****.net/cumttzh/article/details/79790953
step5:目标函数J(W,H)求偏导
∂Wik∂J(W,H)=i,j∑(Hkj−Vij(WH)ijHkj)=i,j∑(Hkj−(WH)ijVijHkj)
同理:
∂Hkj∂J(W,H)=i,j∑(Wik−Vij(WH)ijWik)=i,j∑(Wik−(WH)ijVijWik)
step6:使用梯度下降进行迭代
Wik=Wik+α1i,j∑(Hkj−(WH)ijVijHkj)−−Hkj=Hkj+α2i,j∑(Wik−(WH)ijVijWik)
step7:选取合适的α,得到最终迭代式
α1=Wiki,j∑VijHkj(WH)ijα2=Hkji,j∑VijWik(WH)ij
Wik=Wikj∑Hkji,j∑VijHkj(WH)ij③Hkj=Hkjα2i∑Hiki,j∑VijWik(WH)ij④
算法步骤
Wik=Wik(WHHT)ik(VHT)ik①Hkj=Hkj(WTWH)kj(WTV)kj②
Wik=Wikj∑Hkji,j∑VijHkj(WH)ij③Hkj=Hkjα2i∑Hiki,j∑VijWik(WH)ij④
a. 平方距离
1)随机生成一个W矩阵;
2)固定H,按照公式①迭代更新W直到收敛(W不变或变化很小)
3)固定W,按照公式②迭代更新H直到收敛(H不变或变化很小)
4)重复2)、3)步骤直到对应的损失函数不变或变化很小
b. KL散度
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