def fit(self, w0=None, verbose=0, fnpy=None): N, U, D = self.N, self.U, self.D if verbose > 0: t0 = time.time() print('\nC: %g, %g, %g' % (self.C1, self.C2, self.C3)) num_vars = (U + N + 1) * D if w0 is None: if fnpy is None: w0 = self._init_vars() else: try: assert type(fnpy) == str assert fnpy.endswith('.npy') w0 = np.load(fnpy, allow_pickle=False) print('Restore from %s' % fnpy) except (IOError, ValueError): w0 = self._init_vars() assert w0.shape == (num_vars, ) try: # f: callable(x, g, *args) # LBFGS().minimize(f, x0, progress=progress, args=args) optim = LBFGS() optim.linesearch = 'wolfe' optim.max_linesearch = 100 param_dict = {'N': self.N, 'C': (self.C1, self.C2, self.C3)} res = optim.minimize(objective, w0, progress, args=(self.X, self.cliques, self.data_helper, param_dict, verbose, fnpy)) self.mu = res[:D] self.V = res[D:(U + 1) * D].reshape(U, D) self.W = res[(U + 1) * D:].reshape(N, D) self.trained = True except (LBFGSError, MemoryError) as err: self.trained = False sys.stderr.write('LBFGS failed: {0}\n'.format(err)) sys.stderr.flush() if verbose > 0: print('Training finished in %.1f seconds' % (time.time() - t0))