def predict(self, data): o = self.source_learner.predict(data) I_target = data.is_target if self.opt_succeeded: assert not array_functions.has_invalid(self.g) assert not array_functions.has_invalid(self.h) b = data.R_ul.dot(self.h) w = data.R_ul.dot(self.g) y_old = o.fu[I_target] y_new = (y_old - b) / w I_invalid = array_functions.is_invalid(y_new) y_new[I_invalid] = y_old[I_invalid] o.fu[I_target] = y_new o.y[I_target] = y_new o.b = b o.w = w else: o.b = np.zeros(I_target.sum()) o.w = np.ones(I_target.sum()) o.x = data.x[I_target,:] o.assert_input() return o
def assert_input(self): assert not array_functions.has_invalid(self.fu) assert not array_functions.has_invalid(self.y) assert not array_functions.has_invalid(self.true_y)
def train(self, data): assert data.is_regression y_s, y_true = self.get_predictions(data) I_target = data.is_target I_target_labeled = data.is_target & data.is_labeled & data.is_train y_s = data.y[I_target_labeled] y_true = data.true_y[I_target_labeled] x = array_functions.standardize(data.x) x_t = x[I_target] x_tl = x[I_target_labeled] C = self.C C2 = self.C2 W_ll = array_functions.make_rbf(x_tl, self.sigma, self.metric) W_ll_reg_inv = np.linalg.inv(W_ll+C2*np.eye(W_ll.shape[0])) W_ul = array_functions.make_rbf(x_t, self.sigma, self.metric, x2=x_tl) R_ll = W_ll.dot(W_ll_reg_inv) R_ul = W_ul.dot(W_ll_reg_inv) assert not array_functions.has_invalid(R_ll) assert not array_functions.has_invalid(R_ul) reg = lambda gh: SMSTransfer.reg(gh, R_ul) #f = lambda gh: SMSTransfer.eval(gh, R_ll, R_ul, y_s, y_true, C, reg) f = SMSTransfer.eval jac = SMSTransfer.gradient g0 = np.zeros((R_ll.shape[0] * 2, 1)) gh_ids = np.zeros(g0.shape) gh_ids[R_ll.shape[0]:] = 1 maxfun = np.inf maxitr = np.inf constraints = [] options = { 'disp': False, 'maxiter': maxitr, 'maxfun': maxfun } method = 'L-BFGS-B' #R_ll = np.eye(R_ll.shape[0]) #R_ul = np.eye(R_ll.shape[0]) #y_s = 1*np.ones(y_s.shape) #y_true = 1*np.ones(y_s.shape) args = (R_ll, R_ul, y_s, y_true, C, reg) results = optimize.minimize( f, g0, method=method, jac=jac, options=options, constraints=constraints, args=args ) check_results = False if check_results: results2 = optimize.minimize( f, g0, method=method, jac=None, options=options, constraints=constraints, args=args ) print self.params scipy_opt_methods.compare_results(results, results2, gh_ids) diff = results.x-results2.x print results.x print results2.x g, h = SMSTransfer.unpack_gh(results.x, R_ll.shape[0]) self.opt_succeeded = results.success if not results.success: print 'SMS Opt failed' data.R_ul = R_ul self.g = g self.h = h #assert results.success pass