Подгонка бета-дистрибутива с использованием Pomegranate

#python #python-3.x #pomegranate

#python #python-3.x #pomegranate

Вопрос:

Я пытаюсь приблизить бета-дистрибутив, используя библиотеку pomegranate. Однако, когда я пытаюсь приблизить параметры из сгенерированных данных, я получаю совсем другие параметры. Код для воспроизведения такой ошибки выглядит следующим образом

 import numpy as np
from pomegranate import * 

X = np.random.beta(1, 5, size=10000).reshape(-1, 1) # sample from beta distribution with alpha = 1, beta = 5
print(BetaDistribution.from_samples(X).parameters) # approximate beta parameters
>>> [0.0, 10000.0] # error here
  

Я не уверен, откуда берется ошибка. Похоже, что тестовый файл test_distributions.py выдает правильный ответ. Если есть какие-либо предложения о том, как исправить pomegranate или создать пользовательскую модель в pomegranate , мы будем высоко оценены.

Обратите внимание, что я использую Python 3.6.8

Ответ №1:

Ответ в соответствии с этой проблемой, BetaDistribution предоставленный в текущей библиотеке бета-биномиальный дистрибутив, а не бета-дистрибутив. Вот почему модель не могла поместиться в образец бета-дистрибутива.

Обходное решение

Я получил обходное решение, используя BayesianOptimization библиотеку. В принципе, я пытаюсь максимизировать логарифмическую вероятность распределения из заданных данных, используя байесовскую оптимизационную библиотеку. Следующий код также довольно хорошо обобщает смесь дистрибутивов.

 from bayes_opt import BayesianOptimization

data = np.random.beta(1, 5, size=10000) # create data

def beta_loss(a, b):
    beta_loss = BetaDistribution(a, b).probability(data)
    return np.log(beta_loss).sum()

optimizer = BayesianOptimization(
    f=beta_loss, 
    pbounds={'a': (0.5, 5), 
             'b': (0.5, 20)}, 
    random_state=10
)
# optimize the parameters
optimizer.maximize(
    init_points=5, 
    n_iter=100
)

# plot approximated distribution vs. distribution of the data
x = np.arange(0, 1, 0.01)
plt.hist(data, density=True, bins=100, alpha=0.1)
a, b = [v for k, v in optimizer.max['params'].items()]
plt.plot(x, BetaDistribution(a, b).probability(x))
plt.show()
  

приспособленное распределение

Дополнительно (для смешивания дистрибутивов)

Здесь я просто привожу пример того, как оптимизировать параметры смеси бета-дистрибутива и гауссовского распределения:

 from bayes_opt import BayesianOptimization

# example data of beta/gaussian distribution
data = np.hstack((np.random.beta(1, 10, size=2000), 
                  np.random.randn(1000) * 0.2   0.6))
data = data[np.logical_and(data >= 0.0, data <= 1.0)]

def loss_bimodal(a, b, mu, sigma, w1):
    beta_loss = BetaDistribution(a, b).probability(data)
    norm_loss = NormalDistribution(mu, sigma).probability(data)
    return np.log(w1 * beta_loss   (1 - w1) * norm_loss).sum()

def pdf_bimodal(a, b, mu, sigma, w1, x=np.arange(0, 1, 0.01)):
    return w1 * BetaDistribution(a, b).probability(x)   
        (1 - w1) * NormalDistribution(mu, sigma).probability(x)

optimizer = BayesianOptimization(
    f=loss_bimodal, 
    pbounds={'mu': (0., 1.), 
             'sigma': (0., 1.), 
             'a': (0.5, 5), 
             'b': (1, 25), 
             'w1': (0., 1.)},
    random_state=1
)
optimizer.maximize(
    init_points=5, 
    n_iter=100
)
  

Используя оптимизированные параметры для построения графика распределения следующим образом:

 a, b, mu, sigma, w1 = [v for k, v in optimizer.max['params'].items()]
x = np.arange(0, 1, 0.01)
plt.plot(x, pdf(a, b, mu, sigma, w1, x))
plt.hist(data, density=True, bins=100)
plt.show()
  

введите описание изображения здесь