Exemple #1
0
 def _update_time_features(self):
     for tid in xrange(self.rateDao.num_times):
         rated = self.trainData[self.trainData[self.columns[3]] == tid]
         if not rated.empty:
             rated_uids = map(lambda entry: entry[1][0], rated.iterrows())
             rated_iids = map(lambda entry: entry[1][1], rated.iterrows())
             X = self.P[rated_uids] * self.Q[rated_iids]
             if tid == 0:
                 mean = (self.T[tid + 1] + self.mu_time) / 2
                 sigma = np.linalg.inv(2 * self.lambda_time +
                                       self.alpha * np.dot(X.T, X))
             elif tid < self.rateDao.num_times - 1:
                 rating = np.array(
                     map(lambda entry: entry[1][2],
                         rated.iterrows())) - self.global_mean
                 sigma = np.linalg.inv(2 * self.lambda_time +
                                       self.alpha * np.dot(X.T, X))
                 mu_temp = np.dot(
                     self.lambda_time, self.T[tid - 1] +
                     self.T[tid + 1]) + self.alpha * np.dot(rating, X)
                 mean = np.dot(sigma, mu_temp)
             else:
                 rating = np.array(
                     map(lambda entry: entry[1][2],
                         rated.iterrows())) - self.global_mean
                 sigma = np.linalg.inv(self.lambda_time +
                                       self.alpha * np.dot(X.T, X))
                 mu_temp = np.dot(
                     self.lambda_time,
                     self.T[tid - 1]) + self.alpha * np.dot(rating, X)
                 mean = np.dot(sigma, mu_temp)
             self.T[tid] = mv_normalrand(mean, sigma, self.factors)
Exemple #2
0
 def _update_item_features(self):
     for iid in xrange(self.rateDao.num_items):
         vec = self.V[:, iid] > 0
         features = self.P[vec]
         rating = self.V[vec, iid] - self.global_mean
         sigma = np.linalg.inv(self.lambda_item + self.alpha * np.dot(features.T, features))
         mu_temp = self.alpha * np.dot(features.T, rating) + np.dot(self.lambda_item, self.mu_item)
         mean = np.dot(sigma, mu_temp)
         self.Q[iid] = mv_normalrand(mean, sigma, self.factors)
Exemple #3
0
 def _update_user_features(self):
     for uid in xrange(self.rateDao.num_users):
         vec = self.V[uid, :] > 0
         features = self.Q[vec]
         rating = self.V[uid, vec] - self.global_mean
         sigma = np.linalg.inv(self.lambda_user + self.alpha * np.dot(features.T, features))
         mu_temp = self.alpha * np.dot(features.T, rating) + np.dot(self.lambda_user, self.mu_user)
         mean = np.dot(sigma, mu_temp)
         self.P[uid] = mv_normalrand(mean, sigma, self.factors)
Exemple #4
0
 def _update_item_features(self):
     for iid in xrange(self.rateDao.num_items):
         vec = self.V[:, iid] > 0
         features = self.P[vec]
         rating = self.V[vec, iid] - self.global_mean
         sigma = np.linalg.inv(self.lambda_item +
                               self.alpha * np.dot(features.T, features))
         mu_temp = self.alpha * np.dot(features.T, rating) + np.dot(
             self.lambda_item, self.mu_item)
         mean = np.dot(sigma, mu_temp)
         self.Q[iid] = mv_normalrand(mean, sigma, self.factors)
Exemple #5
0
 def _update_user_features(self):
     for uid in xrange(self.rateDao.num_users):
         vec = self.V[uid, :] > 0
         features = self.Q[vec]
         rating = self.V[uid, vec] - self.global_mean
         sigma = np.linalg.inv(self.lambda_user +
                               self.alpha * np.dot(features.T, features))
         mu_temp = self.alpha * np.dot(features.T, rating) + np.dot(
             self.lambda_user, self.mu_user)
         mean = np.dot(sigma, mu_temp)
         self.P[uid] = mv_normalrand(mean, sigma, self.factors)
Exemple #6
0
 def _update_item_params(self):
     N = self.rateDao.num_items
     X_bar = np.mean(self.Q, 0)
     S_bar = np.cov(self.Q.T)
     norm_X_bar = self.mu0_i - X_bar
     WI_post = self.WI_item + N * S_bar + np.outer(norm_X_bar) * (N * self.beta_item) / (self.beta_item + N)
     WI_post = (WI_post + WI_post.T) / 2.
     df_post = self.df_item + N
     self.lambda_item = wishart.rvs(df_post, WI_post)
     mu_temp = (self.beta_item * self.mu0_i + N * X_bar) / (self.beta_item + N)
     sigma_temp = np.linalg.inv(np.dot(self.beta_item + N, self.lambda_item))
     self.mu_item = mv_normalrand(mu_temp, sigma_temp, self.factors)
Exemple #7
0
 def _update_item_features(self):
     for iid in xrange(self.rateDao.num_items):
         rated = self.trainData[self.trainData[self.columns[1]] == iid]
         if not rated.empty:
             rated_uids = map(lambda entry: entry[1][0], rated.iterrows())
             rated_tids = map(lambda entry: entry[1][3], rated.iterrows())
             P = self.P[rated_uids] * self.T[rated_tids]
             rating = np.array(map(lambda entry: entry[1][2], rated.iterrows())) - self.global_mean
             sigma = np.linalg.inv(self.lambda_item + self.alpha * np.dot(P.T, P))
             mu_temp = self.alpha * np.dot(rating, P) + np.dot(self.lambda_item, self.mu_item)
             mean = np.dot(sigma, mu_temp)
             self.Q[iid] = mv_normalrand(mean, sigma, self.factors)
Exemple #8
0
 def _update_time_params(self):
     N = self.rateDao.num_times
     diff_temp = np.diff(self.T, axis=0)
     diff_t0 = self.T[0] - self.mu0_t
     WI_post = self.WI_time + np.dot(diff_temp.T, diff_temp) + self.beta_time / (1 + self.beta_time) * np.outer(
         diff_t0, diff_t0)
     WI_post = (WI_post + WI_post.T) / 2.
     df_post = self.df_item + N
     self.lambda_time = wishart.rvs(df_post, WI_post)
     mu_temp = (self.beta_time * self.mu0_t + self.T[0]) / (self.beta_item + 1)
     sigma_temp = np.linalg.inv(np.dot(self.beta_item + 1, self.lambda_time))
     self.mu_time = mv_normalrand(mu_temp, sigma_temp, self.factors)
Exemple #9
0
 def _update_user_features(self):
     for uid in xrange(self.rateDao.num_users):
         rated = self.trainData[self.trainData[self.columns[0]] == uid]
         if not rated.empty:
             rated_iids = map(lambda entry: entry[1][1], rated.iterrows())
             rated_tids = map(lambda entry: entry[1][3], rated.iterrows())
             # 逐元素相乘,不是点积
             Q = self.Q[rated_iids] * self.T[rated_tids]
             rating = np.array(map(lambda entry: entry[1][2], rated.iterrows())) - self.global_mean
             sigma = np.linalg.inv(self.lambda_user + self.alpha * np.dot(Q.T, Q))
             mu_temp = self.alpha * np.dot(rating, Q) + np.dot(self.lambda_user, self.mu_user)
             mean = np.dot(sigma, mu_temp)
             self.P[uid] = mv_normalrand(mean, sigma, self.factors)
Exemple #10
0
 def _update_user_params(self):
     N = self.rateDao.num_users
     X_bar = np.mean(self.P, 0)
     S_bar = np.cov(self.P.T)
     norm_X_bar = self.mu0_u - X_bar
     WI_post = self.WI_user + N * S_bar + np.outer(norm_X_bar) * (N * self.beta_user) / (self.beta_user + N)
     # ensure the matrix's symmetry
     WI_post = (WI_post + WI_post.T) / 2.
     df_post = self.df_user + N
     self.lambda_user = wishart.rvs(df_post, WI_post)
     # 以下可参考http://blog.pluskid.org/?p=430
     mu_temp = (self.beta_user * self.mu0_u + N * X_bar) / (self.beta_user + N)
     sigma_temp = np.linalg.inv(np.dot(self.beta_user + N, self.lambda_user))
     self.mu_user = mv_normalrand(mu_temp, sigma_temp, self.factors)
Exemple #11
0
 def _update_time_params(self):
     N = self.rateDao.num_times
     diff_temp = np.diff(self.T, axis=0)
     diff_t0 = self.T[0] - self.mu0_t
     WI_post = self.WI_time + np.dot(
         diff_temp.T, diff_temp) + self.beta_time / (
             1 + self.beta_time) * np.outer(diff_t0, diff_t0)
     WI_post = (WI_post + WI_post.T) / 2.
     df_post = self.df_item + N
     self.lambda_time = wishart.rvs(df_post, WI_post)
     mu_temp = (self.beta_time * self.mu0_t + self.T[0]) / (self.beta_item +
                                                            1)
     sigma_temp = np.linalg.inv(np.dot(self.beta_item + 1,
                                       self.lambda_time))
     self.mu_time = mv_normalrand(mu_temp, sigma_temp, self.factors)
Exemple #12
0
 def _update_item_params(self):
     N = self.rateDao.num_items
     X_bar = np.mean(self.Q, 0)
     S_bar = np.cov(self.Q.T)
     norm_X_bar = self.mu0_i - X_bar
     WI_post = self.WI_item + N * S_bar + np.outer(norm_X_bar) * (
         N * self.beta_item) / (self.beta_item + N)
     WI_post = (WI_post + WI_post.T) / 2.
     df_post = self.df_item + N
     self.lambda_item = wishart.rvs(df_post, WI_post)
     mu_temp = (self.beta_item * self.mu0_i + N * X_bar) / (self.beta_item +
                                                            N)
     sigma_temp = np.linalg.inv(np.dot(self.beta_item + N,
                                       self.lambda_item))
     self.mu_item = mv_normalrand(mu_temp, sigma_temp, self.factors)
Exemple #13
0
 def _update_item_features(self):
     for iid in xrange(self.rateDao.num_items):
         rated = self.trainData[self.trainData[self.columns[1]] == iid]
         if not rated.empty:
             rated_uids = map(lambda entry: entry[1][0], rated.iterrows())
             rated_tids = map(lambda entry: entry[1][3], rated.iterrows())
             P = self.P[rated_uids] * self.T[rated_tids]
             rating = np.array(
                 map(lambda entry: entry[1][2],
                     rated.iterrows())) - self.global_mean
             sigma = np.linalg.inv(self.lambda_item +
                                   self.alpha * np.dot(P.T, P))
             mu_temp = self.alpha * np.dot(rating, P) + np.dot(
                 self.lambda_item, self.mu_item)
             mean = np.dot(sigma, mu_temp)
             self.Q[iid] = mv_normalrand(mean, sigma, self.factors)
Exemple #14
0
 def _update_user_features(self):
     for uid in xrange(self.rateDao.num_users):
         rated = self.trainData[self.trainData[self.columns[0]] == uid]
         if not rated.empty:
             rated_iids = map(lambda entry: entry[1][1], rated.iterrows())
             rated_tids = map(lambda entry: entry[1][3], rated.iterrows())
             # 逐元素相乘,不是点积
             Q = self.Q[rated_iids] * self.T[rated_tids]
             rating = np.array(
                 map(lambda entry: entry[1][2],
                     rated.iterrows())) - self.global_mean
             sigma = np.linalg.inv(self.lambda_user +
                                   self.alpha * np.dot(Q.T, Q))
             mu_temp = self.alpha * np.dot(rating, Q) + np.dot(
                 self.lambda_user, self.mu_user)
             mean = np.dot(sigma, mu_temp)
             self.P[uid] = mv_normalrand(mean, sigma, self.factors)
Exemple #15
0
 def _update_user_params(self):
     N = self.rateDao.num_users
     X_bar = np.mean(self.P, 0)
     S_bar = np.cov(self.P.T)
     norm_X_bar = self.mu0_u - X_bar
     WI_post = self.WI_user + N * S_bar + np.outer(norm_X_bar) * (
         N * self.beta_user) / (self.beta_user + N)
     # ensure the matrix's symmetry
     WI_post = (WI_post + WI_post.T) / 2.
     df_post = self.df_user + N
     self.lambda_user = wishart.rvs(df_post, WI_post)
     # 以下可参考http://blog.pluskid.org/?p=430
     mu_temp = (self.beta_user * self.mu0_u + N * X_bar) / (self.beta_user +
                                                            N)
     sigma_temp = np.linalg.inv(np.dot(self.beta_user + N,
                                       self.lambda_user))
     self.mu_user = mv_normalrand(mu_temp, sigma_temp, self.factors)
Exemple #16
0
 def _update_time_features(self):
     for tid in xrange(self.rateDao.num_times):
         rated = self.trainData[self.trainData[self.columns[3]] == tid]
         if not rated.empty:
             rated_uids = map(lambda entry: entry[1][0], rated.iterrows())
             rated_iids = map(lambda entry: entry[1][1], rated.iterrows())
             X = self.P[rated_uids] * self.Q[rated_iids]
             if tid == 0:
                 mean = (self.T[tid + 1] + self.mu_time) / 2
                 sigma = np.linalg.inv(2 * self.lambda_time + self.alpha * np.dot(X.T, X))
             elif tid < self.rateDao.num_times - 1:
                 rating = np.array(map(lambda entry: entry[1][2], rated.iterrows())) - self.global_mean
                 sigma = np.linalg.inv(2 * self.lambda_time + self.alpha * np.dot(X.T, X))
                 mu_temp = np.dot(self.lambda_time, self.T[tid - 1] + self.T[tid + 1]) + self.alpha * np.dot(rating,
                                                                                                             X)
                 mean = np.dot(sigma, mu_temp)
             else:
                 rating = np.array(map(lambda entry: entry[1][2], rated.iterrows())) - self.global_mean
                 sigma = np.linalg.inv(self.lambda_time + self.alpha * np.dot(X.T, X))
                 mu_temp = np.dot(self.lambda_time, self.T[tid - 1]) + self.alpha * np.dot(rating, X)
                 mean = np.dot(sigma, mu_temp)
             self.T[tid] = mv_normalrand(mean, sigma, self.factors)