Могу ли я исправить среднее значение одного компонента гауссовской модели смеси в питоне перед подгонкой?

Я заинтересован в подгонке 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()

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


person Benjamin Doughty    schedule 07.11.2019    source источник
comment
Пожалуйста, поделитесь тем, что вы уже пробовали для создания сюжета; посмотрите, как создать минимально воспроизводимый пример.   -  person desertnaut    schedule 07.11.2019
comment
@desertnaut спасибо за предложение, только что!   -  person Benjamin Doughty    schedule 07.11.2019


Ответы (2)


Afaik, вы не можете делать точно то, что хотите в sklearn.

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


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


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


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


(iv)

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

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

person Drey    schedule 07.11.2019

Sklearn предоставляет возможность фиксации среднего значения (также известного как местоположение) для отдельных распределений, как показано, например. в этом другом ответе. Это можно сделать, предоставив параметр floc методу fit (обозначает фиксированное местоположение).

Однако, как упомянул Дрей, это невозможно для GMM. Если мы внимательно посмотрим на код, то увидим, что GaussianMixture расширяет BaseMixture. И когда мы смотрим на соответствующий fit метод, мы видим, что он выполняет алгоритм максимизации ожиданий и не допускает ничего подобного фиксированному результату.

Добавление этой функциональности к существующему коду может повлечь за собой серьезные препирательства с реализацией EM и, вероятно, вызовет больше проблем, чем что-либо еще.

Тем не менее, кажется, что GMM действительно не лучшая модель для такого рода распределения. На первый взгляд кажется, что смесь бета-дистрибутивов может помочь.

Удивительная библиотека Python pomegranate очень проста в использовании и позволяет сочетать произвольные дистрибутивы. . Здесь вы можете увидеть код для поддерживаемых дистрибутивов, бета-версия, похоже, присутствует:

https://pomegranate.readthedocs.io/en/latest/

Ура!
Андрес

person fr_andres    schedule 05.04.2021
comment
Спасибо, Андрес, я проверю эту библиотеку, она выглядит интересной. (Хотя оказывается, что наивный GMM дает мне ~ 90% пути, поэтому я не уверен, насколько я действительно забочусь о том, чтобы сделать все правильно, ха-ха...). Привет Бен. - person Benjamin Doughty; 07.04.2021
comment
Ошибка с распределениями exp сильно накапливается ближе к хвостам. Если вы имеете дело с центральными значениями, это вполне может быть хорошо, но будьте осторожны с выбросами. - person fr_andres; 07.04.2021