Verständnis Gaussian Mixture Models
Ich versuche zu verstehen, die Ergebnisse aus der scikit-learn gaussian mixture-Modell-Implementierung. Werfen Sie einen Blick auf das folgende Beispiel:
#!/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()
Hier habe ich zum ersten generieren einer Beispiel-Verteilung konstruiert aus gaussfunktionen, dann passen ein gaussian mixture Modell für diese Daten. Als Nächstes möchte ich die Wahrscheinlichkeit berechnen für eine gegebene Eingabe. Praktischerweise ist der scikit-Implementierung bieten die score_samples
Methode, genau das zu tun. Jetzt versuche ich zu verstehen, dass diese Ergebnisse. Ich dachte immer, dass ich nur die Parameter der gaussfunktionen von der GMM passen und zu konstruieren, das sehr gleiche Verteilung durch summieren über Sie und dann normalisiert sich das integral zu 1. Jedoch, wie Sie sehen können, in den plot, die gezogenen Proben aus den score_samples
Methode, die perfekt passen (rote Linie), um die ursprünglichen Daten (blaues Histogramm), die manuell konstruierte Verteilung (schwarze Linie) nicht. Ich würde gerne verstehen, wo mein denken falsch gelaufen ist und warum kann ich nicht konstruieren, die die Verteilung selbst durch die Summe der gaussfunktionen, wie der GMM passen!?! Vielen Dank für jede Eingabe!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur falls jemand in der Zukunft wird sich über die gleiche Sache: Man hat die Normalisierung der einzelnen Komponenten, nicht die Summe:
GaussianMixture.fit
als ich wusste nicht, dass die Form, die benötigt werden, umnp.expand_dims(samples, 1).shape
stattsamples.shape