Einführung
In diesem Lab werden wir uns mit verschiedenen Initialisierungsmethoden für Gaussian Mixture Models (GMM) befassen. Wir werden die scikit-learn-Bibliothek verwenden, um Stichproben-Daten zu generieren und die Cluster-Ergebnisse zu visualisieren. Es gibt vier verschiedene Methoden für den Initialisierungsparameter init_param: kmeans (Standard), random, random_from_data und k-means++.
Tipps für die VM
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 der 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.
Bibliotheken importieren und Stichproben-Daten generieren
Wir beginnen, indem wir die erforderlichen Bibliotheken importieren und einige Stichproben-Daten mit der Funktion make_blobs aus scikit-learn generieren.
import matplotlib.pyplot as plt
import numpy as np
from sklearn.mixture import GaussianMixture
from sklearn.utils.extmath import row_norms
from sklearn.datasets._samples_generator import make_blobs
from timeit import default_timer as timer
## Generate some data
X, y_true = make_blobs(n_samples=4000, centers=4, cluster_std=0.60, random_state=0)
X = X[:, ::-1]
n_samples = 4000
n_components = 4
x_squared_norms = row_norms(X, squared=True)
Funktion definieren, um die initialen Mittelwerte zu erhalten
Als nächstes definieren wir eine Funktion get_initial_means, die die Stichproben-Daten, die Initialisierungsmethode und den Zufallszustand als Eingaben nimmt und die initialen Mittelwerte zurückgibt.
def get_initial_means(X, init_params, r):
## Führen Sie ein GaussianMixture mit max_iter=0 aus, um die initialen Mittelwerte auszugeben
gmm = GaussianMixture(
n_components=4, init_params=init_params, tol=1e-9, max_iter=0, random_state=r
).fit(X)
return gmm.means_
Die Stichproben-Daten und die Initialisierungszentren darstellen
Wir werden nun die Stichproben-Daten und die Initialisierungszentren für jede Initialisierungsmethode mit unterschiedlichen Farben darstellen. Wir berechnen auch die Zeit, die für die Initialisierung benötigt wird, und die Anzahl der Iterationen, die der GMM benötigt, um sich zu konvergieren.
methods = ["kmeans", "random_from_data", "k-means++", "random"]
colors = ["navy", "turquoise", "cornflowerblue", "darkorange"]
times_init = {}
relative_times = {}
plt.figure(figsize=(4 * len(methods) // 2, 6))
plt.subplots_adjust(
bottom=0.1, top=0.9, hspace=0.15, wspace=0.05, left=0.05, right=0.95
)
for n, method in enumerate(methods):
r = np.random.RandomState(seed=1234)
plt.subplot(2, len(methods) // 2, n + 1)
start = timer()
ini = get_initial_means(X, method, r)
end = timer()
init_time = end - start
gmm = GaussianMixture(
n_components=4, means_init=ini, tol=1e-9, max_iter=2000, random_state=r
).fit(X)
times_init[method] = init_time
for i, color in enumerate(colors):
data = X[gmm.predict(X) == i]
plt.scatter(data[:, 0], data[:, 1], color=color, marker="x")
plt.scatter(
ini[:, 0], ini[:, 1], s=75, marker="D", c="orange", lw=1.5, edgecolors="black"
)
relative_times[method] = times_init[method] / times_init[methods[0]]
plt.xticks(())
plt.yticks(())
plt.title(method, loc="left", fontsize=12)
plt.title(
"Iter %i | Init Time %.2fx" % (gmm.n_iter_, relative_times[method]),
loc="right",
fontsize=10,
)
plt.suptitle("GMM iterations and relative time taken to initialize")
plt.show()
Die Ergebnisse interpretieren
Wir können aus dem Diagramm sehen, dass k-means++ sowohl eine geringe Initialisierungszeit als auch eine geringe Anzahl an Iterationen des GaussianMixture benötigt, um sich zu konvergieren. Wenn mit random_from_data oder random initialisiert wird, benötigt das Modell mehr Iterationen, um sich zu konvergieren. Alle drei alternativen Methoden benötigen weniger Zeit zur Initialisierung im Vergleich zu kmeans.
Zusammenfassung
In diesem Lab haben wir uns mit verschiedenen Initialisierungsmethoden für Gaussian Mixture Models (GMM) und mit der Verwendung dieser Methoden zur Clusterbildung von Stichproben-Daten mit der scikit-learn-Bibliothek vertraut gemacht. Wir haben die Stichproben-Daten und die Initialisierungszentren für jede Initialisierungsmethode dargestellt und die Ergebnisse interpretiert.