def test_strict_log_probability(basic_model): basic_model.set_priors([Normal(1, 0.5), Exponential(0.5)]) x = np.array([1.0, 0.5]) assert basic_model.strict_log_probability( ('item 0', 'item 1'), x) == pytest.approx(-0.1413058, 0.001) assert basic_model.strict_log_probability( ('item 1', 'item 0'), x) == pytest.approx(-2.026650, 0.001)
def test_inference_with_different_priors(basic_model): basic_model.set_priors([Normal(1, 1), Exponential(-0.5)]) assert basic_model.weights is None with pytest.warns(UserWarning): basic_model.infer_weights() assert all(a - b < 1e-4 for a, b in zip(basic_model.weights.tolist(), [1, 0]))
def test_probability(basic_model): basic_model.set_priors([Normal(1, 0.5), Exponential(0.5)]) x = np.array([1.0, 0.5]) assert basic_model.probability(x) == np.exp(basic_model.log_probability(x))
def test_indifferent_log_probability(basic_model): basic_model.set_priors([Normal(1, 0.5), Exponential(0.5)]) x = np.array([1.0, 0.5]) assert basic_model.indifferent_log_probability( ('item 0', 'item 1'), x) == pytest.approx(-0.7188213, 0.001)
import pandas as pd from pypbl.priors import Normal, Exponential from pypbl.elicitation import BayesPreference data = pd.read_csv('data/mtcars.csv') print(data) # set index of the data frame to be the item names data.set_index('model', inplace=True) p = BayesPreference(data=data) p.set_priors([ Exponential(1), # MPG - high miles per gallon is preferred Normal(), # number of cylinders Normal(), # displacement Exponential(2), # horsepower - high horsepower is preferred Normal(), # real axle ratio Normal(), # weight Exponential(-3), # quarter mile time - high acceleration is preferred Normal(), # engine type Normal(), # transmission type Normal(), # number of gears Normal() # number of carburetors ]) # add some preferences and infer the weights for each parameter p.add_strict_preference('Pontiac Firebird', 'Fiat 128') p.add_strict_preference('Mazda RX4', 'Mazda RX4 Wag') p.add_indifferent_preference('Merc 280', 'Merc 280C') p.infer_weights(method='mean')
def test_exponential_prior_with_negative_weights(): prior = Exponential(mu=-0.5) assert prior.mu == -0.5 assert prior(-0.5) > prior(-1) assert prior(-0.5) > prior(1)
def test_exponential_prior(): prior = Exponential(mu=0.5) assert prior.mu == 0.5 assert prior(0.5) > prior(-1) assert prior(0.5) > prior(1)
def test_default_exponential_prior(): prior = Exponential() assert prior.mu == 1 assert prior(0) > prior(-1) assert prior(0) > prior(1) assert prior(np.array([0])) > prior(np.array([-1]))