2016-04-05 25 views
1

bu, matris faktorizasyon kodumun bir parçasıdır (çok garip bir nmf versiyonu). Benim sorunum, her zaman yinelemem rağmen, W ve H matrislerinin eski kopyalarını saklıyorum, W zaman güncellemeyi her bitirdiğinde W ve W'yi karşılaştırdığımda, bunlar aslında aynıdır! Yani gerçek hata çıkışı her zaman 0'dır ve ilk döngüden sonra while döngüsü durur. Ancak, "#print eski - yeni", W [r] [i] öğesinin aslında her seferinde güncellendiğini gösterir. Göremediğim şey nedir? Bu hatlardaPython Numpy Matrix Güncelleme Karışıklığı

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 
+0

:

bu deneyin. –

+0

'w [r] [I] = ...' şüpheli görünüyor. 'w [r, I] = ...' daha iyidir. – hpaulj

+0

w [r] [i] de çalışır. Asıl sorunum kopyaları doğru şekilde yapmamamdı. Öneri için teşekkürler. –

cevap

0

: bir kopya tasarruf değil old_W = W # save old values old_H = H , bir referans tutuyor (old_W ve W aynı bellek parçası olan). Farklı W ve H matrisleri kullandığınızda kriter() işlevi kesinlikle çalışır ve çıkış farklı hata değerleri, arada old_W = W.copy() # save old values old_H = H.copy()

+0

Merhaba! Evet bu gerçekten hataydı! Çok teşekkür ederim! –

+0

harika, lütfen soruyu kapatmak için cevabı kabul edin. – welch