Составление ГМД с заданными значениями и весами - PullRequest
0 голосов
/ 24 июня 2019

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

Iпопытался использовать решение, представленное в этом вопросе , но они не построили GMD как выпуклую комбинацию двух распределений, а вместо этого взяли случайные выборки из одного или другого распределения.Это то, что я пытался решить, но похоже, что на графике есть только одно распределение по Гауссу:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import random as rnd

theta = np.array([[3.91973221e-05, 2.59889568e-04], [5.32160367e-06, 4.99763548e-06],[6.65158426e-01, 3.34841574e-01]])

n = 100000
number_of_distributions = 2
mu = theta[0]
sigma = theta[1]
weights = theta[2]
samples = []

for i in range(n):
       population = [rnd.gauss(mu[i], np.sqrt(sigma[i])) for i in range(number_of_distributions)]
       samples.append(rnd.choices(population, weights=weights))
sns.distplot(samples)
plt.show()

enter image description here

В принципе, я хочу эточтобы быть немного более понятным на графике, это два отдельных гауссовых распределения, и, наблюдая за графиком, кто-то, кто не видел код, должен быть в состоянии различить, насколько велика разница между этими двумя распределениями.

1 Ответ

1 голос
/ 25 июня 2019

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

У вас есть два варианта:

Вариант 1

Если вы можете немного изменить данные, попробуйте изменить одно из следующих способов:

Это для mu[0]=0.91973221e-02

Gaussian Mixture Distribution using distplot

Вариант 2

Если вам нужно работать с этим набором данных и вы не можете изменить mu или sigma, вы можете поиграть с параметром пропускной способности bw функции kde (и увеличить количество бинов вашей гистограммы). Для некоторых значений bw функция pdf не такая плавная, поэтому вы можете увидеть два пика ваших распределений:

sns.distplot(samples, bins=400, kde_kws={"bw": 0.004})
plt.xlim(-0.015, 0.015)

Не забудьте настроить параметр xlim на вашем графике. Иногда это выглядит странно для небольших значений bw:

Different band width values of the kde plot

.. просто чтобы быть уверенным

Вы использовали sqrt ваших сигма-параметров при генерации случайных чисел. Если сигма означает стандартное отклонение в вашем пресете, используйте его напрямую.

...