def _update_user_params(self):
# same as _update_user_params
N = self.n_user
X_bar = np.mean(self.user_features_, 0).reshape((self.n_feature, 1))
S_bar = np.cov(self.user_features_.T)
# mu_{0} - U_bar
diff_X_bar = self.mu0_user - X_bar
# W_{0}_star
WI_post = inv(inv(self.WI_user) +
N * S_bar +
np.dot(diff_X_bar, diff_X_bar.T) *
(N * self.beta_user) / (self.beta_user + N))
# Note: WI_post and WI_post.T should be the same.
# Just make sure it is symmertic here
WI_post = (WI_post + WI_post.T) / 2.0
# update alpha_user
df_post = self.df_user + N
# LAMBDA_{U} ~ W(W{0}_star, df_post)
self.alpha_user = wishart.rvs(df_post, WI_post, 1, self.rand_state)
# update mu_user
# mu_{0}_star = (beta_{0} * mu_{0} + N * U_bar) / (beta_{0} + N)
mu_mean = (self.beta_user * self.mu0_user + N * X_bar) / \
(self.beta_user + N)
# decomposed inv(beta_{0}_star * LAMBDA_{U})
mu_var = cholesky(inv(np.dot(self.beta_user + N, self.alpha_user)))
# sample multivariate gaussian
self.mu_user = mu_mean + np.dot(
mu_var, self.rand_state.randn(self.n_feature, 1))
评论列表
文章目录