Бедный ГММ вписывается в склеарн от 2 гауссов - PullRequest
1 голос
/ 08 октября 2019

Я хочу установить двухкомпонентную модель смеси со sklearn для последующего вычисления обратной вероятности. Но с кодом, который у меня пока есть, подходит для одного из двух дистрибутивов идеально (переоснащение?), А другой очень плохо. Я сделал фиктивный пример с выборкой 2 гауссовых

import numpy as np
from sklearn.mixture import GaussianMixture
import matplotlib.pyplot as plt 

def calc_pdf():
    """
    calculate gauss mixture modelling for 2 comp
    return pdfs 
    """
    d = np.random.normal(-0.1, 0.07, 5000)
    t = np.random.normal(0.2, 0.13, 10000)
    pool = np.concatenate([d, t]).reshape(-1,1)
    label = ['d']*d.shape[0] + ['t'] * t.shape[0]
    X = pool[pool>0].reshape(-1,1)
    X = np.log(X)
    clf = GaussianMixture(
                        n_components=2,
                        covariance_type='full',
                        tol = 1e-24,
                        max_iter = 1000
                        )
    logprob = clf.fit(X).score_samples(X)
    responsibilities = clf.predict_proba(X)
    pdf = np.exp(logprob)
    pdf_individual = responsibilities * pdf[:, np.newaxis]
    plot_gauss(np.log(d), np.log(t), pdf_individual, X)
    return pdf_individual[0], pdf_individual[1]

def plot_gauss(d, t, pdf_individual, x):
    fig, ax = plt.subplots(figsize=(12, 9), facecolor='white')
    ax.hist(d, 30, density=True, histtype='stepfilled', alpha=0.4)
    ax.hist(t, 30, density=True, histtype='stepfilled', alpha=0.4)
    ax.plot(x, pdf_individual, '.')
    ax.set_xlabel('$x$')
    ax.set_ylabel('$p(x)$')
    plt.show()
calc_pdf()

, который производит этот график здесь

fit2comp

Есть ли что-то очевидное, что япропал?

...