我正在尝试使用Kullback-Liebler散度作为相似性度量来实现非负矩阵分解.该算法描述于:http://hebb.mit.edu/people/seung/papers/nmfconverge.pdf.下面是我的python/numpy实现,带有一个运行它的示例矩阵.
简而言之,该算法应该学习矩阵W(n乘r)和H(r乘m)使得V(n乘m)近似为WH.你从W和H中的随机值开始,并按照Seung和Lee论文中描述的更新规则,你应该越来越接近W和H的良好近似值.
该算法被证明可以单调地减少分歧度量,但这不是我的实现中发生的事情.相反,它稳定在两个发散值之间的交替.如果你看一下W和H,你可以看到产生的因子分解不是特别好.
我想知道在计算W的更新时是否使用更新的或旧的H.我尝试了两种方式,并且它不会改变实现的行为.
我已经多次检查了我对文件的实现情况,而且我没有看到我做错了什么.任何人都可以对这个问题有所了解吗?
import numpy as np
def update(V, W, H, r, n, m):
n,m = V.shape
WH = W.dot(H)
# equation (5)
H_coeff = np.zeros(H.shape)
for a in range(r):
for mu in range(m):
for i in range(n):
H_coeff[a, mu] += W[i, a] * V[i, mu] / WH[i, mu]
H_coeff[a, mu] /= sum(W)[a]
H = H * H_coeff
W_coeff = np.zeros(W.shape)
for i in range(n):
for a in range(r):
for mu in range(m):
W_coeff[i, …Run Code Online (Sandbox Code Playgroud)