【问题标题】:Python Numpy Matrix Update ConfusionPython Numpy 矩阵更新混淆
【发布时间】:2016-07-25 03:41:47
【问题描述】:

这是我的矩阵分解代码的一部分(一个非常奇怪的 nmf 版本)。我的问题是,虽然每次迭代时,我都会保存 W 和 H 矩阵的旧副本,但当我在 W 每次完成更新后比较 old_W 和 W 时,它们实际上是相同的!所以实际的错误输出总是 0 并且 while 循环在第一次迭代后停止。但是,“#print old - new”显示元素 W[r][i] 实际上每次都会更新。什么是我没有看到的?

def csmf(V, l, max_iter, err, alpha=0.01, beta=0.01, lamb=0.01):
  W = np.random.rand(V.shape[0], l)
  H = np.random.rand(l, V.shape[1])
  n = V.shape[0]
  N = V.shape[1]

  NwOone = 60
  NwOtwo = 60
  NhOone = 50
  NhOtwo = 50

  for t in range(max_iter):
    old_W = W # save old values
    old_H = H
    old = criterion(V,old_W,old_H,l,alpha,beta,lamb)
    print "iteration ", t

    ##### update W
    print "updating W"
    setw = range(0,n)
    subset_one = random.sample(setw,NwOone)
    subset_two = calcGw(V, W, H, n, l, alpha, beta, NwOtwo)
    chosen = np.intersect1d(subset_one,subset_two)

    for r in chosen:
      for i in range(len(W[0])):
        update = wPosNeg(W[r],N,i,l,V,r,beta,H)
        old = W[r][i]
        W[r][i] = update
        new = W[r][i]
        #print old - new

    ##### update H
    print "updating H"
    seth = range(0,N)
    subset_oneh = random.sample(seth,NhOone)
    subset_twoh = calcGh(V, W, H, N, l, NhOtwo,lamb)
    chosenh = np.intersect1d(subset_oneh,subset_twoh)

    for s in chosenh: # column
      for i in range(len(H)):
        updateh = hPosNeg(H[i],n,i,l,V,s,lamb,W)
        H[i][s] = updateh

    ##### check err
    print "Checking criterion"
    print criterion(V,W,H,l,alpha,beta,lamb)
    print criterion(V,old_W,old_H,l,alpha,beta,lamb)
    actual = abs(criterion(V,W,H,l,alpha,beta,lamb)  -criterion(V,old_W,old_H,l,alpha,beta,lamb))
    if actual <= err: return W, H, actual
  return W, H, actual

dmat = np.random.rand(100,80)
W, H, err = csmf(dmat, 1, 10, 0.001, alpha=0.001, beta=0.001, lamb=0.001)
print err

【问题讨论】:

  • 顺便说一句,criteria() 函数在我使用不同的 W 和 H 矩阵时肯定会起作用并输出不同的错误值。
  • w[r][I]=... 看起来很可疑。 w[r,I]=... 更好。
  • w[r][i] 也可以。我真正的问题是我没有以正确的方式制作副本。谢谢你的建议。
  • 有时(但并非总是)W[r] 是副本,而不是视图。在这种情况下,W[r][i]=... 不会更改 W

标签: numpy matrix sparse-matrix matrix-factorization


【解决方案1】:

在这些行中: old_W = W # save old values old_H = H 您不是在保存副本,而是在保留引用(old_W 和 W 是同一块内存)。

试试这个: old_W = W.copy() # save old values old_H = H.copy()

【讨论】:

  • 嗨!是的,这确实是错误!非常感谢!
  • 很好,请接受答案以关闭问题。
猜你喜欢
  • 2013-03-25
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2021-09-29
  • 2015-12-17
  • 2012-01-20
  • 2019-11-23
相关资源
最近更新 更多