Sie könnten es bereits herausgefunden haben, aber ich dachte, ich könnte auch eine mögliche Lösung zu diesem Thema.
Der folgende Code erstellt Zufallsdaten mit Abmessungen (2,100) und versucht, eine 128-Mischung gmm unter Verwendung des EM_uniform Algorithmus zu trainieren:
import sidekit
import numpy as np
import random as rn
gmm = sidekit.Mixture()
data = np.array([[rn.random() for i in range(100)],[rn.random() for i in range(100)]])
gmm.EM_uniform(data,
distrib_nb=128,
iteration_min=3,
iteration_max=10,
llk_gain=0.01,
do_init=True)
Dies führt jedoch in den gleichen Fehler, wie Sie berichtet: ValueError: Operanden konnten nicht zusammen mit shapes ausgestrahlt werden (128,100) (128,0)
Ich vermute, dass es einen Bug in der Berechnung von gmm.invcov in Sidekit.Mixture._init_uniform() gibt, also habe ich a herausgefunden manuelle Initialisierung der Mischung mit Code von Sidekit.Mixture._init() (die Initialisierungsfunktion für den EM_ split() - Algorithmus).
Der folgende Code lief ohne Fehler auf meinem Computer:
import sidekit
import numpy as np
import random as rn
import copy
gmm = sidekit.Mixture()
data = np.array([[rn.random() for i in range(100)],[rn.random() for i in range(100)]])
# Initialize the Mixture with code from Sidekit.Mixture._init()
mu = data.mean(0)
cov = (data**2).mean(0)
gmm.mu = mu[None]
gmm.invcov = 1./cov[None]
gmm.w = np.asarray([1.0])
gmm.cst = np.zeros(gmm.w.shape)
gmm.det = np.zeros(gmm.w.shape)
gmm.cov_var_ctl = 1.0/copy.deepcopy(gmm.invcov)
gmm._compute_all()
# Now run EM without initialization
gmm.EM_uniform(data,
distrib_nb=128,
iteration_min=3,
iteration_max=10,
llk_gain=0.01,
do_init=False)
Die folgende Ausgabe gab: [-31,419146414931213, 54,759037708692404, 54,759037708692404, 54,759037708692404], , die die Log-Likelihood-Werte nach jeder Iteration (Konvergenz nach 4 Iterationen. Beachten Sie, dass diese Beispieldaten zu klein sind, um ein Gmm zu trainieren.)
Ich kann nicht garantieren, dass dies später zu Fehlern führt, hinterlassen Sie einen Kommentar, wenn das der Fall ist!
Wie für HDF5-Dateien, lesen Sie die h5py documentation für Tutorials. Außerdem können Sie mit hdfview in den Inhalt der h5-Dateien schauen, was für das spätere Debugging sehr praktisch ist.
Vielen Dank für die richtige Antwort Jørgen A. Ja, ich habe herausgefunden, dass es einen Fehler bei der Initialisierung der Invcov-Matrix gibt. Haben Sie ein Github-Konto mit GMM-UBM-Beispielen im Sidekit? – stefos
Kennen Sie auch eine Möglichkeit, UBM-GMM-System mit eigenen Daten in numply Arrays zu betreiben? Ich meine, ohne einen Feature Server und hdf5 Dateien. Weil ich meine eigenen benutzerdefinierten Funktionen extrahiert habe. – stefos