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
:
bu deneyin. –
'w [r] [I] = ...' şüpheli görünüyor. 'w [r, I] = ...' daha iyidir. – hpaulj
w [r] [i] de çalışır. Asıl sorunum kopyaları doğru şekilde yapmamamdı. Öneri için teşekkürler. –