def main():
    Settings.new(
        linear_solver_partial_time_limit=None,
        non_linear_solver_partial_time_limit=None,
        solver_total_time_limit=20000,
    )

    products = [i for i in range(11)]
    ground_truth = MarkovChainModel.simple_random(products=products)

    offersets = OfferedProductsGenerator(products).generate(TRANSACTIONS)
    transactions = TransactionGenerator(ground_truth).generate_for(offersets)

    initial_solution = MarkovChainModel.simple_deterministic(products)
    estimator_max = MaximumLikelihoodEstimator()
    estimation_max = estimator_max.estimate(initial_solution, transactions)

    initial_solution = MarkovChainModel.simple_deterministic(products)
    estimator_em = MarkovChainExpectationMaximizationEstimator()
    estimation_em = estimator_em.estimate(initial_solution, transactions)

    initial_solution = MarkovChainRank2Model.simple_deterministic(products)
    estimator_mkv2 = MaximumLikelihoodEstimator()
    estimation_mkv2 = estimator_mkv2.estimate(initial_solution, transactions)

    plot(ground_truth, estimator_max, estimator_em, estimator_mkv2,
         estimation_max, estimation_em, estimation_mkv2, transactions)
Esempio n. 2
0
def main():
    Settings.new(
        linear_solver_partial_time_limit=None,
        non_linear_solver_partial_time_limit=None,
        solver_total_time_limit=1800,
    )

    products = [i for i in range(11)]
    number_lists = 10
    lists = [
        list(np.random.permutation(len(products))) for _ in range(number_lists)
    ]
    ground_truth = RankedListModel.simple_random(products=products,
                                                 ranked_lists=lists)

    offersets = OfferedProductsGenerator(products).generate(TRANSACTIONS)
    transactions = TransactionGenerator(ground_truth).generate_for(offersets)

    initial_solution = LatentClassModel.simple_deterministic(products, 10)
    estimator_max = MaximumLikelihoodEstimator()
    estimation_max = estimator_max.estimate(initial_solution, transactions)

    initial_solution = LatentClassModel.simple_deterministic(products, 10)
    estimator_em = LatentClassExpectationMaximizationEstimator()
    estimation_em = estimator_em.estimate(initial_solution, transactions)

    initial_solution = LatentClassModel.simple_deterministic(products, 10)
    estimator_fw = LatentClassFrankWolfeEstimator()
    estimation_fw = estimator_fw.estimate(initial_solution, transactions)

    plot(ground_truth, estimation_em, estimation_max, estimation_fw,
         estimator_em, estimator_max, estimator_fw, transactions)
Esempio n. 3
0
    def estimate(self, model, transactions):
        likelihood_loss_function_coefficients = self.likelihood_loss_function_coefficients(
            transactions)
        new_likelihood = model.log_likelihood_for(transactions)

        max_iterations = len(likelihood_loss_function_coefficients)
        cpu_time = time_for_optimization(
            partial_time=Settings.instance(
            ).non_linear_solver_partial_time_limit(),
            total_time=Settings.instance().solver_total_time_limit(),
            profiler=self.profiler())
        start_time = time.time()

        for _ in range(max_iterations):
            old_likelihood = new_likelihood

            possible_mnl_model = self.look_for_new_mnl_model(
                model, likelihood_loss_function_coefficients)
            model.add_new_class_with(possible_mnl_model)
            self.update_weights_for(model,
                                    likelihood_loss_function_coefficients)

            new_likelihood = model.log_likelihood_for(transactions)

            likelihood_does_not_increase = new_likelihood < old_likelihood
            likelihood_does_not_increase_enough = abs(
                new_likelihood - old_likelihood) / len(transactions) < 1e-7
            time_limit = (time.time() - start_time) > cpu_time

            if likelihood_does_not_increase or likelihood_does_not_increase_enough or time_limit:
                break

        return model
Esempio n. 4
0
def main():
    Settings.new(
        linear_solver_partial_time_limit=None,
        non_linear_solver_partial_time_limit=None,
        solver_total_time_limit=20000,
    )

    products = [i for i in range(11)]
    ground_truth = MixedLogitModel(
        products=products,
        mus=[p + 1 for p in products],
        sigmas=[1 if p % 2 == 0 else 10 for p in products])

    offersets = OfferedProductsGenerator(products).generate(TRANSACTIONS)
    transactions = TransactionGenerator(ground_truth).generate_for(offersets)

    initial_solution = MixedLogitModel.simple_deterministic(products)
    estimator_mx = MaximumLikelihoodEstimator()
    estimation_mx = estimator_mx.estimate(initial_solution, transactions)

    initial_solution = MultinomialLogitModel.simple_deterministic(products)
    estimator_mnl = MaximumLikelihoodEstimator()
    estimation_mnl = estimator_mnl.estimate(initial_solution, transactions)

    plot(ground_truth, estimation_mx, estimator_mx, estimation_mnl,
         estimator_mnl, transactions)
Esempio n. 5
0
def main():
    Settings.new(
        linear_solver_partial_time_limit=None,
        non_linear_solver_partial_time_limit=None,
        solver_total_time_limit=20000,
    )
    nests = [
        {'lambda': 0.8, 'products': [0, 1, 2]},
        {'lambda': 0.8, 'products': [3, 4, 5]},
        {'lambda': 0.8, 'products': [6, 7, 8]},
        {'lambda': 0.8, 'products': [9, 10]},
    ]

    products = [i for i in range(11)]
    ground_truth = NestedLogitModel(products=products, etas=[0.1 * i for i in range(1, 12)], nests=nests)

    offersets = OfferedProductsGenerator(products).generate(TRANSACTIONS)
    transactions = TransactionGenerator(ground_truth).generate_for(offersets)

    initial_solution = NestedLogitModel.simple_deterministic(products, nests)
    estimator_nl = MaximumLikelihoodEstimator()
    estimation_nl = estimator_nl.estimate(initial_solution, transactions)

    initial_solution = MultinomialLogitModel.simple_deterministic(products)
    estimator_mnl = MaximumLikelihoodEstimator()
    estimation_mnl = estimator_mnl.estimate(initial_solution, transactions)

    plot(ground_truth, estimator_mnl, estimation_mnl, estimator_nl, estimation_nl, transactions)
Esempio n. 6
0
def main():
    Settings.new(
        linear_solver_partial_time_limit=300.0,
        non_linear_solver_partial_time_limit=300.0,
        solver_total_time_limit=1800.0,
    )

    ground_truth, transactions = read_synthetic_instance(
        'instances/100_lists_300_periods_1_instance.json')
    products = ground_truth.products

    nests = [{
        'products': [0],
        'lambda': 0.8
    }, {
        'products': [i for i in range(1, len(products)) if i % 2 == 0],
        'lambda': 0.8
    }, {
        'products': [i for i in range(1, len(products)) if i % 2 == 1],
        'lambda': 0.8
    }]

    lists = [[i] + list(sorted(set(products) - {i}))
             for i in range(len(products))]

    models_to_run = [
        (ExponomialModel.simple_deterministic(products),
         MaximumLikelihoodEstimator()),
        (MultinomialLogitModel.simple_deterministic(products),
         MaximumLikelihoodEstimator()),
        (RandomChoiceModel.simple_deterministic(products),
         RandomChoiceModelMaximumLikelihoodEstimator()),
        (LatentClassModel.simple_deterministic(products, 1),
         LatentClassFrankWolfeEstimator()),
        (MarkovChainModel.simple_deterministic(products),
         MarkovChainExpectationMaximizationEstimator()),
        (MarkovChainRank2Model.simple_deterministic(products),
         MaximumLikelihoodEstimator()),
        (MixedLogitModel.simple_deterministic(products),
         MaximumLikelihoodEstimator()),
        (NestedLogitModel.simple_deterministic(products, nests=nests),
         MaximumLikelihoodEstimator()),
        (RankedListModel.simple_deterministic(products, ranked_lists=lists),
         RankedListExpectationMaximizationEstimator(MIPMarketExplorer())),
    ]

    results = []
    for initial_solution, estimator in models_to_run:
        if hasattr(estimator, 'estimate_with_market_discovery'):
            model = estimator.estimate_with_market_discovery(
                initial_solution, transactions)
        else:
            model = estimator.estimate(initial_solution, transactions)
        soft_rmse = model.soft_rmse_for(ground_truth)
        results.append((model, estimator.profiler(), soft_rmse))

    plot(results)
Esempio n. 7
0
    def estimate(self, model, transactions):
        self.profiler().reset_convergence_criteria()
        self.profiler().update_time()
        model = self.custom_initial_solution(model, transactions)
        cpu_time = time_for_optimization(partial_time=Settings.instance().non_linear_solver_partial_time_limit(),
                                         total_time=Settings.instance().solver_total_time_limit(),
                                         profiler=self.profiler())

        start_time = time.time()
        while True:
            self.profiler().start_iteration()
            model = self.one_step(model, transactions)
            likelihood = model.log_likelihood_for(transactions)
            self.profiler().stop_iteration(likelihood)

            if self.profiler().should_stop() or (time.time() - start_time) > cpu_time:
                break

        return model
Esempio n. 8
0
def run(estimation_method, model, input_file, output_file):
    print(' * Reading input file...')
    ground_truth, transactions = read_synthetic_instance(input_file)
    products = ground_truth.products

    print('    - Amount of transactions: %s' % len(transactions))
    print('    - Amount of products: %s' % len(products))

    print(' * Retrieving estimation method...')
    model_info = estimators[estimation_method]['models'][model]

    print(' * Retrieving settings...')
    Settings.new(
        linear_solver_partial_time_limit=model_info['settings']
        ['linear_solver_partial_time_limit'],
        non_linear_solver_partial_time_limit=model_info['settings']
        ['non_linear_solver_partial_time_limit'],
        solver_total_time_limit=model_info['settings']
        ['solver_total_time_limit'],
    )

    print(' * Creating initial solution...')
    model = model_info['model_class'](products)

    print(' * Starting estimation...')
    if hasattr(model_info['estimator'], 'estimate_with_market_discovery'):
        result = model_info['estimator'].estimate_with_market_discovery(
            model, transactions)
    else:
        result = model_info['estimator'].estimate(model, transactions)

    rmse = ground_truth.soft_rmse_for(result)

    print(' * Computing result...')
    print('')
    print('Soft RMSE: %s' % rmse)
    print('')

    result.save(output_file)
    return rmse
def main():
    Settings.new(
        linear_solver_partial_time_limit=None,
        non_linear_solver_partial_time_limit=None,
        solver_total_time_limit=20000,
    )

    products = [i for i in range(11)]
    ground_truth = MultinomialLogitModel.simple_random(products=products)

    offersets = OfferedProductsGenerator(products).generate(TRANSACTIONS)
    transactions = TransactionGenerator(ground_truth).generate_for(offersets)

    initial_solution = ExponomialModel.simple_deterministic(products)
    estimator_exp = MaximumLikelihoodEstimator()
    estimation_exp = estimator_exp.estimate(initial_solution, transactions)

    initial_solution = MultinomialLogitModel.simple_deterministic(products)
    estimator_mnl = MaximumLikelihoodEstimator()
    estimation_mnl = estimator_mnl.estimate(initial_solution, transactions)

    plot(ground_truth, estimation_exp, estimator_exp, estimation_mnl, estimator_mnl, transactions)
def main():
    Settings.new(
        linear_solver_partial_time_limit=None,
        non_linear_solver_partial_time_limit=None,
        solver_total_time_limit=20000,
    )

    products = [i for i in range(11)]
    number_lists = 5
    lists = [
        list(np.random.permutation(len(products))) for _ in range(number_lists)
    ]
    ground_truth = RankedListModel.simple_random(products=products,
                                                 ranked_lists=lists)

    offersets = OfferedProductsGenerator(products).generate(TRANSACTIONS)
    transactions = TransactionGenerator(ground_truth).generate_for(offersets)

    initial_solution = RankedListModel.simple_deterministic(products,
                                                            ranked_lists=lists)
    estimator_max = RankedListMaximumLikelihoodEstimator()
    estimation_max = estimator_max.estimate(initial_solution, transactions)

    initial_solution = RankedListModel.simple_deterministic(products,
                                                            ranked_lists=lists)
    estimator_em = RankedListExpectationMaximizationEstimator()
    estimation_em = estimator_em.estimate(initial_solution, transactions)

    initial_solution = RankedListModel.simple_deterministic_independent(
        products)
    estimator_mip = RankedListExpectationMaximizationEstimator.with_this(
        MIPMarketExplorer())
    estimation_mip = estimator_mip.estimate_with_market_discovery(
        initial_solution, transactions)

    plot(ground_truth, estimator_max, estimator_em, estimator_mip,
         estimation_max, estimation_em, estimation_mip, transactions)
Esempio n. 11
0
 def cpu_time(self, profiler):
     return time_for_optimization(
         partial_time=Settings.instance().linear_solver_partial_time_limit(
         ),
         total_time=Settings.instance().solver_total_time_limit(),
         profiler=profiler)