Я заинтересован в подгонке 2-компонентной гауссовской модели смеси к данным, показанным ниже. "https://i.stack.imgur.com/gLPlO.png" alt="данные с логарифмическим преобразованием, не может превышать 0"> преобразованные счетчики, нормализованные между 0-1, максимальное значение, которое когда-либо примут мои данные, равно 0. Когда я пытаюсь выполнить наивную подгонку с использованием sklearn.mixture.GaussianMixture (код ниже), я получаю результирующую подгонку, которая, очевидно, не то, что я хочу.
from sklearn.mixture import GaussianMixture
import numpy as np
# start with some count data in (0,1]
logged_counts = np.log(counts)
model = GaussianMixture(2).fit(logged_counts.reshape(-1,1))
# plot resulting fit
x_range = np.linspace(np.min(logged_counts), 0, 1000)
pdf = np.exp(model.score_samples(x_range.reshape(-1, 1)))
responsibilities = model.predict_proba(x_range.reshape(-1, 1))
pdf_individual = responsibilities * pdf[:, np.newaxis]
plt.hist(logged_counts, bins='auto', density=True, histtype='stepfilled', alpha=0.5)
plt.plot(x_range, pdf, '-k', label='Mixture')
plt.plot(x_range, pdf_individual, '--k', label='Components')
plt.legend()
plt.show()
Мне бы понравилось, если бы я мог зафиксировать среднее значение верхнего компонента на 0 и оптимизировать только другое среднее значение, две дисперсии и доли смешивания. (Кроме того, я хотел бы иметь возможность использовать полунормаль для компонента справа.) Есть ли простой способ сделать это с помощью встроенных функций в python/sklearn, или мне придется самостоятельно построить эту модель, используя какой-то вероятностный язык программирования?