예제 #1
0
 def _get_probabilities_np(self, utility, lambda_k):
     n_objects = self.n_objects_fit_
     nests_indices = self.nests_indices
     n_nests = self.n_nests
     temp_lambdas = np.ones((n_objects, n_objects), lambda_k.dtype)
     temp_lambdas[nests_indices[:, 0], nests_indices[:, 1]] = temp_lambdas.T[
         nests_indices[:, 0], nests_indices[:, 1]
     ] = lambda_k
     uti_per_nest = np.transpose((utility[:, None] / temp_lambdas), (0, 2, 1))
     ind = np.array([[[i1, i2], [i2, i1]] for i1, i2 in nests_indices])
     ind = ind.reshape(2 * n_nests, 2)
     x = uti_per_nest[:, ind[:, 0], ind[:, 1]].reshape(-1, 2)
     log_sum_exp_nest = npu.logsumexp(x).reshape(-1, n_nests)
     pnk = np.exp(
         log_sum_exp_nest * lambda_k - npu.logsumexp(log_sum_exp_nest * lambda_k)
     )
     p = np.zeros(tuple(utility.shape), dtype=float)
     for i in range(n_nests):
         i1, i2 = nests_indices[i]
         p[:, i1] += (
             np.exp(uti_per_nest[:, i1, i2] - log_sum_exp_nest[:, i]) * pnk[:, i]
         )
         p[:, i2] += (
             np.exp(uti_per_nest[:, i2, i1] - log_sum_exp_nest[:, i]) * pnk[:, i]
         )
     return p
예제 #2
0
 def _get_probabilities_np(self, utility, lambda_k, alpha_ik):
     n_nests = self.n_nests
     n_instances, n_objects = utility.shape
     pik = np.zeros((n_instances, n_objects, n_nests))
     sum_per_nest_x = np.zeros((n_instances, n_nests))
     for i in range(n_nests):
         uti = (utility + np.log(alpha_ik[:, :, i])) * 1 / lambda_k[i]
         sum_n = npu.logsumexp(uti)
         pik[:, :, i] = np.exp(uti - sum_n)
         sum_per_nest_x[:, i] = sum_n[:, 0] * lambda_k[i]
     pnk = np.exp(sum_per_nest_x - npu.logsumexp(sum_per_nest_x))
     pnk = pnk[:, None, :]
     p = pik * pnk
     p = p.sum(axis=2)
     return p
예제 #3
0
 def _get_probabilities_np(self, Y_n, utility, lambda_k, utility_k):
     n_instances, n_objects = Y_n.shape
     pni_k = np.zeros((n_instances, n_objects))
     ivm = np.zeros((n_instances, self.n_nests))
     for i in range(self.n_nests):
         sub_tensor = np.copy(utility)
         sub_tensor[np.where(Y_n != i)] = -1e50
         ink = npu.logsumexp(sub_tensor)
         pni_k[np.where(Y_n == i)] = np.exp(sub_tensor -
                                            ink)[np.where(Y_n == i)]
         ivm[:, i] = lambda_k[i] * ink[:, 0] + utility_k[i]
     pk = np.exp(ivm - npu.logsumexp(ivm))
     pn_k = np.zeros((n_instances, n_objects))
     for i in range(self.n_nests):
         rows, cols = np.where(Y_n == i)
         p = np.ones((n_instances, n_objects)) * pk[:, i][:, None]
         pn_k[rows, cols] = p[rows, cols]
     p = pni_k * pn_k
     return p