Можно ли зафиксировать среднее значение одного компонента модели гауссовой смеси в python перед установкой? - PullRequest
3 голосов
/ 07 ноября 2019

Я заинтересован в подгонке 2-компонентной модели гауссовой смеси к данным, показанным ниже. log-transformed count ratio data, can't go above 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()

fit using two-component GMM from sklearn Мне бы понравилось, если бы я мог установить среднее значение верхнего компонента на 0 и оптимизировать только другое среднее значение, две дисперсии и доли смешивания. (Кроме того, я хотел бы иметь возможность использовать полунормаль для компонента справа.) Есть ли простой способ сделать это со встроенными функциями в python / sklearn, или мне придется создавать эту модель самостоятельно, используякакой-нибудь вероятностный язык программирования?

1 Ответ

2 голосов
/ 07 ноября 2019

Афаик, вы не можете сделать точно то, что вы хотите в sklearn.

Имхо, в основном, существует несколько стратегий: (i) внедрить GMM самостоятельно, (ii) переключиться на другой язык /framework, (iii) адаптировать код GMM или (iv) адаптировать.


(i) Вы, вероятно, не хотите делать это, если не хотите учиться для себя.


(ii) Вы можете использовать stan и адаптировать код в последнем абзаце, чтобы иметь фиксированный компонент по вашему выбору (тип и параметры распространения)


(iii) Выможет сделать (i), но немного адаптировать код склеарна или просто использовать методы оценки, но с вашими собственными небольшими изменениями.


(iv)

  • Gaussian Модель смеси здесь не будет работать (как вы упомянули), потому что вам требуется усеченное нормальное распределение для «первого» (фиксированного) компонента.
  • Если вам не требуется подгонкадля дисперсии фиксированного компонента, тогда вы всегда можете jпросто вычтите ваш фиксированный компонент из данных. (т.е. для каждой точки вычтите значение квантиля точки из значения точки)
  • Если вы не возражаете против точности в оценке, вы можете сделать два пропущенных: Сначала используйте GMM для идентификации обоих компонентов. Затем посмотрите только на данные из компонента, который вы хотите исправить. Подходит усеченная гауссовская модель (используйте .fit(data)). Затем вычтите полученные параметры из ваших исходных данных (как в варианте 2). И тогда подойдет GMM. чтобы найти следующий компонент.

Надеюсь, это поможет: -)

...