Я заинтересован в подгонке 2-компонентной модели гауссовой смеси к данным, показанным ниже. Однако, поскольку то, что я здесь рисую, представляет собой лог-преобразованные значения, нормализованные, чтобы быть между 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, или мне придется создавать эту модель самостоятельно, используякакой-нибудь вероятностный язык программирования?