안녕하세요. 올려주신 강의를 바탕으로 LDA모델을 구현해보고 있습니다.
올려주신 코드를 바탕으로 구현을 해보던 중, alpha의 업데이트 부분이 잘 되지 않아 질문드립니다.
글에 tab이 들어가지 않아 파일도 따로 첨부해 드립니다.
from scipy.special import digamma
from scipy.special import polygamma
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
L_k = 5
L_d = 500
n_iter = 99
a_ = np.zeros(shape=(n_iter+1,L_k))
a_[0,:] = np.random.gamma(1,1,5)
gamma = np.random.gamma(1,1,size=(L_d,L_k))
for i in range(n_iter) :
H = np.zeros(shape=(L_k, L_k), dtype=float)
g = np.zeros(shape=(L_k), dtype=float)
for k1 in range(L_k) :
g[k1] = float(L_d)*(digamma(sum(a_[i,:]))-digamma(a_[i,k1]))
for d in range(L_d) :
g[k1] = g[k1] + (digamma(gamma[d,k1])-digamma(sum(gamma[d,:])))
for k2 in range(L_k) :
H[k1][k2] = 0
if k1 == k2 :
H[k1][k2] = H[k1][k2] - float(L_d)*polygamma(1,a_[i,k1])
H[k1][k2] = H[k1][k2] + float(L_d)*polygamma(1,sum(a_[i,:]))
a_[(i+1),:] = a_[i,:] - np.dot(np.linalg.inv(H),g)
plt.plot(a_)
제가 사용한 코드는 다음과 같습니다. 원래 제가 사용하던 코드에서 계속 alpha의 값이 음수가 나와 올려주신 강의자료를 바탕으로 코드를 짜보았습니다.
하지만 여전히 음수값으로 업데이트가 되는데 한 번 확인해주시면 감사하겠습니다.
참고로 gamma의 값은 모두 양수이므로 감마분포에서 뽑았으며, 마찬가지로 alpha또한 모두 양수이어야 하므로 감마분포에서 샘플링 했습니다.
감사합니다.
comment