Gaussian Mixture Model Sinuskurve

Machine LearningMachine LearningBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab verwenden wir das Gaussian Mixture Model-Algorithmus, um einen Datensatz anzupassen, der einer rauschen Sinuskurve folgt. Wir werden zwei verschiedene Arten von Gaussian Mixture Modellen verwenden, nämlich den Expectation-Maximization-Algorithmus und das Bayesian Gaussian Mixture Model mit einem Dirichlet-Prozess-Prior.

VM-Tipps

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49138{{"Gaussian Mixture Model Sinuskurve"}} end

Laden der erforderlichen Bibliotheken

Wir beginnen mit dem Laden der erforderlichen Bibliotheken für dieses Lab.

import itertools

import numpy as np
from scipy import linalg
import matplotlib.pyplot as plt
import matplotlib as mpl

from sklearn import mixture

Datensatz generieren

Als nächstes werden wir einen Datensatz generieren, der einer rauschen Sinuskurve folgt.

## Parameter
n_samples = 100

## Zufällige Stichprobe generieren, die einer Sinuskurve folgt
np.random.seed(0)
X = np.zeros((n_samples, 2))
Schritt = 4.0 * np.pi / n_samples

for i in range(X.shape[0]):
    x = i * Schritt - 6.0
    X[i, 0] = x + np.random.normal(0, 0.1)
    X[i, 1] = 3.0 * (np.sin(x) + np.random.normal(0, 0.2))

Ein Gaussian Mixture Model mit EM anpassen

Wir werden ein klassisches Gaussian Mixture Model mit 10 Komponenten anpassen, das mit dem Expectation-Maximization-Algorithmus angepasst wird.

## Ein Gaussian mixture mit EM anpassen, indem zehn Komponenten verwendet werden
gmm = mixture.GaussianMixture(
    n_components=10, covariance_type="full", max_iter=100
).fit(X)

Ergebnisse des EM-Algorithmus plotten

Wir werden die Ergebnisse des Expectation-Maximization-Algorithmus plotten.

def plot_results(X, Y, Mittelwerte, Kovarianzen, index, Titel):
    splot = plt.subplot(5, 1, 1 + index)
    for i, (Mittelwert, Kovarianz, Farbe) in enumerate(zip(Mittelwerte, Kovarianzen, color_iter)):
        v, w = linalg.eigh(Kovarianz)
        v = 2.0 * np.sqrt(2.0) * np.sqrt(v)
        u = w[0] / linalg.norm(w[0])
        ## da der DP nicht jede Komponente verwenden wird, die er zur Verfügung hat
        ## es sei denn, er braucht sie, sollten wir die redundanten
        ## Komponenten nicht plotten.
        if not np.any(Y == i):
            continue
        plt.scatter(X[Y == i, 0], X[Y == i, 1], 0.8, color=Farbe)

        ## Zeichnen Sie eine Ellipse, um die Gaussian-Komponente anzuzeigen
        Winkel = np.arctan(u[1] / u[0])
        Winkel = 180.0 * Winkel / np.pi  ## in Grad umwandeln
        ell = mpl.patches.Ellipse(Mittelwert, v[0], v[1], angle=180.0 + Winkel, color=Farbe)
        ell.set_clip_box(splot.bbox)
        ell.set_alpha(0.5)
        splot.add_artist(ell)

    plt.xlim(-6.0, 4.0 * np.pi - 6.0)
    plt.ylim(-5.0, 5.0)
    plt.title(Titel)
    plt.xticks(())
    plt.yticks(())

plot_results(
    X, gmm.predict(X), gmm.means_, gmm.covariances_, 0, "Expectation-maximization"
)

Ein Bayesisches Gaussian Mixture Model mit einem Dirichlet-Prozess-Prior anpassen

Wir werden nun ein Bayesisches Gaussian Mixture Model mit einem Dirichlet-Prozess-Prior anpassen. Wir werden einen niedrigen Wert für das Konzentrations-Prior setzen, um das Modell dazu zu veranlassen, eine kleinere Anzahl aktiver Komponenten zu bevorzugen.

dpgmm = mixture.BayesianGaussianMixture(
    n_components=10,
    covariance_type="full",
    weight_concentration_prior=1e-2,
    weight_concentration_prior_type="dirichlet_process",
    mean_precision_prior=1e-2,
    covariance_prior=1e0 * np.eye(2),
    init_params="random",
    max_iter=100,
    random_state=2,
).fit(X)

Ergebnisse des Bayesischen GMM mit niedrigem Konzentrations-Prior plotten

Wir werden die Ergebnisse des Bayesischen Gaussian Mixture Models mit einem Dirichlet-Prozess-Prior und einem niedrigen Wert für das Konzentrations-Prior plotten.

plot_results(
    X,
    dpgmm.predict(X),
    dpgmm.means_,
    dpgmm.covariances_,
    1,
    "Bayesian Gaussian mixture models with a Dirichlet process prior "
    r"for $\gamma_0=0.01$.",
)

Aus dem Bayesischen GMM mit niedrigem Konzentrations-Prior abprobieren

Wir werden nun aus dem Bayesischen Gaussian Mixture Model mit einem Dirichlet-Prozess-Prior und einem niedrigen Wert für das Konzentrations-Prior abprobieren.

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    0,
    "Gaussian mixture with a Dirichlet process prior "
    r"for $\gamma_0=0.01$ sampled with $2000$ samples.",
)

Ein Bayesisches Gaussian Mixture Model mit einem Dirichlet-Prozess-Prior anpassen

Wir werden nun ein Bayesisches Gaussian Mixture Model mit einem Dirichlet-Prozess-Prior anpassen. Wir werden einen hohen Wert für das Konzentrations-Prior setzen, um dem Modell mehr Freiheit zu geben, um die feingranulare Struktur der Daten zu modellieren.

dpgmm = mixture.BayesianGaussianMixture(
    n_components=10,
    covariance_type="full",
    weight_concentration_prior=1e2,
    weight_concentration_prior_type="dirichlet_process",
    mean_precision_prior=1e-2,
    covariance_prior=1e0 * np.eye(2),
    init_params="kmeans",
    max_iter=100,
    random_state=2,
).fit(X)

Ergebnisse des Bayesischen GMM mit hohem Konzentrations-Prior plotten

Wir werden die Ergebnisse des Bayesischen Gaussian Mixture Models mit einem Dirichlet-Prozess-Prior und einem hohen Wert für das Konzentrations-Prior plotten.

plot_results(
    X,
    dpgmm.predict(X),
    dpgmm.means_,
    dpgmm.covariances_,
    2,
    "Bayesian Gaussian mixture models with a Dirichlet process prior "
    r"for $\gamma_0=100$",
)

Aus dem Bayesischen GMM mit hohem Konzentrations-Prior abprobieren

Wir werden nun aus dem Bayesischen Gaussian Mixture Model mit einem Dirichlet-Prozess-Prior und einem hohen Wert für das Konzentrations-Prior abprobieren.

X_s, y_s = dpgmm.sample(n_samples=2000)
plot_samples(
    X_s,
    y_s,
    dpgmm.n_components,
    1,
    "Gaussian mixture with a Dirichlet process prior "
    r"for $\gamma_0=100$ sampled with $2000$ samples.",
)

Zusammenfassung

In diesem Lab haben wir das Gaussian Mixture Model-Algorithmus verwendet, um einen Datensatz anzupassen, der einer rauschen Sinuskurve folgt. Wir haben zwei verschiedene Arten von Gaussian Mixture Modellen verwendet, nämlich den Expectation-Maximization-Algorithmus und das Bayesische Gaussian Mixture Model mit einem Dirichlet-Prozess-Prior. Wir haben die Ergebnisse geplottet und von beiden Modellen abprobiert, um ihre Leistung zu vergleichen. Die Wahl des besten Modells ist subjektiv und hängt davon ab, ob wir uns auf das Gesamtbild konzentrieren möchten oder die Hochdichtebereiche des Signals genau verfolgen möchten.