Понимание моделей гауссовой смеси

Я пытаюсь понять результаты, полученные в результате реализации модели гауссовой модели scikit-learn. Взгляните на следующий пример:

#!/opt/local/bin/python import numpy as np import matplotlib.pyplot as plt from sklearn.mixture import GaussianMixture # Define simple gaussian def gauss_function(x, amp, x0, sigma): return amp * np.exp(-(x - x0) ** 2. / (2. * sigma ** 2.)) # Generate sample from three gaussian distributions samples = np.random.normal(-0.5, 0.2, 2000) samples = np.append(samples, np.random.normal(-0.1, 0.07, 5000)) samples = np.append(samples, np.random.normal(0.2, 0.13, 10000)) # Fit GMM gmm = GaussianMixture(n_components=3, covariance_type="full", tol=0.001) gmm = gmm.fit(X=np.expand_dims(samples, 1)) # Evaluate GMM gmm_x = np.linspace(-2, 1.5, 5000) gmm_y = np.exp(gmm.score_samples(gmm_x.reshape(-1, 1))) # Construct function manually as sum of gaussians gmm_y_sum = np.full_like(gmm_x, fill_value=0, dtype=np.float32) for m, c, w in zip(gmm.means_.ravel(), gmm.covariances_.ravel(), gmm.weights_.ravel()): gmm_y_sum += gauss_function(x=gmm_x, amp=w, x0=m, sigma=np.sqrt(c)) # Normalize so that integral is 1 gmm_y_sum /= np.trapz(gmm_y_sum, gmm_x) # Make regular histogram fig, ax = plt.subplots(nrows=1, ncols=1, figsize=[8, 5]) ax.hist(samples, bins=50, normed=True, alpha=0.5, color="#0070FF") ax.plot(gmm_x, gmm_y, color="crimson", lw=4, label="GMM") ax.plot(gmm_x, gmm_y_sum, color="black", lw=4, label="Gauss_sum") # Annotate diagram ax.set_ylabel("Probability density") ax.set_xlabel("Arbitrary units") # Draw legend plt.legend() plt.show() 

Результат из приведенного выше кода

Здесь я сначала создаю выборочное распределение, построенное из gaussians, а затем подгоняет модель гауссовой смеси к этим данным. Затем я хочу рассчитать вероятность для некоторого заданного ввода. Удобно, реализация scikit предлагает метод score_samples чтобы сделать именно это. Теперь я пытаюсь понять эти результаты. Я всегда думал, что я могу просто взять параметры гауссианцев из подгонки GMM и построить такое же распределение, суммируя их, а затем нормализуя интеграл к 1. Однако, как вы можете видеть на сюжете, образцы, взятые из метод score_samples идеально подходит (красная линия) к исходным данным (синяя гистограмма), вручную построенный дистрибутив (черная линия) этого не делает. Я хотел бы понять, где мое мышление пошло не так, и почему я не могу сам построить дистрибуцию, суммируя гауссиан, как это дается GMM!!! Большое спасибо за любой вклад!

  • Травление подготовленного классификатора дает разные результаты по результатам, полученным непосредственно из нового, но идентично обученного классификатора
  • в чем разница между весом класса = none и auto в svm scikit learn
  • Неожиданные оценки перекрестной проверки с помощью scikit-learn LinearRegression
  • Как работает параметр class_weight в scikit-learn?
  • ошибка pycharm при импорте, даже если она работает в терминале
  • матрица смешения сюжета sklearn с метками
  • как нормализовать массив numpy?
  • Python - генерировать массив определенной автокорреляции
  • One Solution collect form web for “Понимание моделей гауссовой смеси”

    На всякий случай, если кто-то в будущем задается вопросом о том же: нужно нормализовать отдельные компоненты, а не сумму:

     import numpy as np import matplotlib.pyplot as plt from sklearn.mixture import GaussianMixture # Define simple gaussian def gauss_function(x, amp, x0, sigma): return amp * np.exp(-(x - x0) ** 2. / (2. * sigma ** 2.)) # Generate sample from three gaussian distributions samples = np.random.normal(-0.5, 0.2, 2000) samples = np.append(samples, np.random.normal(-0.1, 0.07, 5000)) samples = np.append(samples, np.random.normal(0.2, 0.13, 10000)) # Fit GMM gmm = GaussianMixture(n_components=3, covariance_type="full", tol=0.001) gmm = gmm.fit(X=np.expand_dims(samples, 1)) # Evaluate GMM gmm_x = np.linspace(-2, 1.5, 5000) gmm_y = np.exp(gmm.score_samples(gmm_x.reshape(-1, 1))) # Construct function manually as sum of gaussians gmm_y_sum = np.full_like(gmm_x, fill_value=0, dtype=np.float32) for m, c, w in zip(gmm.means_.ravel(), gmm.covariances_.ravel(), gmm.weights_.ravel()): gauss = gauss_function(x=gmm_x, amp=1, x0=m, sigma=np.sqrt(c)) gmm_y_sum += gauss / np.trapz(gauss, gmm_x) * w # Make regular histogram fig, ax = plt.subplots(nrows=1, ncols=1, figsize=[8, 5]) ax.hist(samples, bins=50, normed=True, alpha=0.5, color="#0070FF") ax.plot(gmm_x, gmm_y, color="crimson", lw=4, label="GMM") ax.plot(gmm_x, gmm_y_sum, color="black", lw=4, label="Gauss_sum", linestyle="dashed") # Annotate diagram ax.set_ylabel("Probability density") ax.set_xlabel("Arbitrary units") # Make legend plt.legend() plt.show() 

    введите описание изображения здесь

    Python - лучший язык программирования в мире.