Audioverarbeitung ist eine der wichtigsten Anwendungsdomänen der digitalen Signalverarbeitung (DSP) und maschinelles Lernen. Die Modellierung akustischer Umgebungen ist ein wesentlicher Schritt bei der Entwicklung digitaler Audioverarbeitungssysteme wie Spracherkennung, Sprachverbesserung, akustischer Echo -Stornierung usw.

Akustische Umgebungen sind mit Hintergrundgeräuschen gefüllt, die mehrere Quellen haben können. Wenn Sie beispielsweise in einem Café sitzen, die Straße entlang gehen oder Ihr Auto fahren, hören Sie Geräusche, die als Stör- oder Hintergrundgeräusche angesehen werden können. Solche Störungen folgen nicht unbedingt demselben statistischen Modell, und daher kann eine Mischung von Modellen nützlich sein, um sie zu modellieren.

Diese statistischen Modelle können auch nützlich sein, um akustische Umgebungen in verschiedene Kategorien zu klassifizieren, z. B. ein ruhiges Auditorium (Klasse 1) oder einen etwas lauteren Raum mit geschlossenen Fenstern (Klasse 2) und eine dritte Choice mit Home windows Open (Klasse 3). In jedem Fall kann der Pegel des Hintergrundrauschens unter Verwendung einer Mischung aus Rauschquellen modelliert werden, die jeweils mit einer anderen Wahrscheinlichkeit und einem anderen akustischen Pegel stattfinden.

Eine weitere Anwendung solcher Modelle liegt in der Simulation von akustischen Rauschen in verschiedenen Umgebungen, auf denen Lösungen für DSP und maschinelles Lernen entwickelt werden können, um spezifische akustische Probleme in praktischen Audiosystemen wie Interferenzkrebs, Echo -Stornierung, Spracherkennung, Sprachverbesserung usw. zu lösen. .

Foto von Matoo.studio An Unplash

Ein einfaches statistisches Modell, das in solchen Szenarien nützlich sein kann, ist die Gaußsche Mischungsmodell (GMM), bei dem angenommen wird, dass jede der verschiedenen Rauschquellen einer bestimmten Gaußschen Verteilung mit einer bestimmten Varianz folgt. Es kann angenommen werden, dass alle Verteilungen keinen Mittelwert haben und gleichzeitig für diese Anwendung ausreichend genau sind, wie auch in dieser gezeigt wird Artikel.

Jede der GMM -Verteilungen hat eine eigene Wahrscheinlichkeit, zum Hintergrundgeräusch beizutragen. Zum Beispiel könnte es ein konsistentes Hintergrundgeräusch geben, das die meiste Zeit auftritt, während andere Quellen intermittierend sein können, z. B. das Geräusch, das durch Fenster kommt.

Ein Beispiel für simulierte GMM -Daten im Laufe der Zeit (normalisiert auf die Stichprobenzeit) ist in der folgenden Abbildung dargestellt, in der zwei Gaußsche Rauschquellen vorhanden sind, beide mit Null, jedoch mit zwei unterschiedlichen Varianzen. In diesem Beispiel erfolgt das niedrigere Varianzsignal häufiger mit einer Wahrscheinlichkeit von 90%, daher die intermittierenden Spikes in den generierten Daten, die das Sign mit höherer Varianz darstellen.

In anderen Szenarien und abhängig von der Anwendung kann es umgekehrt sein, in der das Rauschsignal mit hohem Varianz häufiger auftritt (wie in einem späteren Beispiel in diesem Artikel gezeigt wird). Python Der Code zum Generieren und Analyse von GMM -Daten wird später in diesem Artikel auch angezeigt.

Nehmen wir an, dass das gesammelte Hintergrundrauschsignal (beispielsweise unter Verwendung eines hochwertigen Mikrofons) als Realisierungen unabhängiger und identisch verteilter (IID) zufällige Variablen, die wie unten gezeigt folgen, als Realisierungen von unabhängigen und identisch verteilten (IID) modelliert wird.

Das Modellierungsproblem läuft somit auf die Schätzung der Modellparameter (dh P1, σ²1 und σ²2) unter Verwendung der beobachteten Daten (IID) hinaus. In diesem Artikel werden wir die verwenden Momente Methode (Mama) Schätzer für diesen Zweck.

Um die Dinge weiter zu vereinfachen, können wir davon ausgehen, dass die Rauschvarianzen (σ²1 und σ²2) bekannt sind und dass nur der Mischparameter (P1) geschätzt werden soll. Der MOM -Schätzer kann verwendet werden, um mehr als einen Parameter (dh p1, σ²1 und σ²2) zu schätzen, wie in Kapitel 9 des Buches gezeigt: “Statistische Signalverarbeitung: Schätztheorie ”, von Steven Kay. In diesem Beispiel werden wir jedoch annehmen, dass nur P1 unbekannt ist und geschätzt werden soll.

Da beide Gaußschen im GMM null Mittel sind, beginnen wir mit dem zweiten Second und versuchen, den unbekannten Parameter P1 als Funktion des zweiten Moments wie folgt zu erhalten.

Beachten Sie, dass eine weitere einfache Methode, um die Momente einer zufälligen Variablen (z. B. zweiter Second oder höher) zu erhalten, indem die Momentgenerierungsfunktion (MGF) verwendet wird. Ein gutes Lehrbuch in der Wahrscheinlichkeitstheorie, das solche Themen abdeckt, und mehr ist: “Einführung in die Wahrscheinlichkeit für Datenwissenschaft”, Von Stanley H. Chan.

Bevor wir weiter fortfahren, möchten wir diesen Schätzer in Bezug auf die grundlegenden Eigenschaften von Schätzern wie Voreingenommenheit, Varianz, Konsistenz usw. quantifizieren. Wir werden dies später numerisch mit einem Python -Beispiel überprüfen.

Beginnend mit der Schätzerverzerrung können wir zeigen, dass der obige Schätzer von P1 tatsächlich wie folgt unvoreingenommen ist.

Wir können dann die Varianz unseres Schätzers wie folgt abgeben.

Aus der obigen Analyse geht auch hervor, dass der Schätzer konsistent ist, da er unvoreingenommen ist und seine Varianz abnimmt, wenn die Stichprobengröße (n) zunimmt. Wir werden auch die obige Formel der P1 -Schätzungsvarianz in unserem numerischen Python -Beispiel (später in diesem Artikel ausführlich gezeigt) verwenden, wenn sie die Theorie mit praktischen numerischen Ergebnissen vergleichen.

Lassen Sie uns nun einen Python -Code vorstellen und lustige Sachen machen!

Zunächst generieren wir unsere Daten, die einem GMM ohne Mittelwerte und Standardabweichungen von 2 bzw. 10 folgen, wie im folgenden Code gezeigt. In diesem Beispiel entspricht der Mischparameter P1 = 0,2 und die Stichprobengröße der Daten 1000.

# Import the Python libraries that we are going to want on this GMM instance
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

# GMM knowledge technology
mu = 0 # each gaussians in GMM are zero imply
sigma_1 = 2 # std dev of the primary gaussian
sigma_2 = 10 # std dev of the second gaussian
norm_params = np.array(((mu, sigma_1),
                        (mu, sigma_2)))
sample_size = 1000
p1 = 0.2 # chance that the information level comes from first gaussian
mixing_prob = (p1, (1-p1))
# A stream of indices from which to decide on the element
GMM_idx = np.random.alternative(len(mixing_prob), dimension=sample_size, change=True, 
                p=mixing_prob)
# GMM_data is the GMM pattern knowledge
GMM_data = np.fromiter((stats.norm.rvs(*(norm_params(i))) for i in GMM_idx),
                   dtype=np.float64)

Dann zeichnen wir das Histogramm der generierten Daten im Vergleich zur Wahrscheinlichkeitsdichtefunktion wie unten gezeigt. Die Abbildung zeigt den Beitrag beider Gauß -Dichten im Gesamt -GMM, wobei jede Dichte durch ihren entsprechenden Faktor skaliert wird.

Der Python -Code, mit dem die obige Abbildung generiert wird, ist unten dargestellt.

x1 = np.linspace(GMM_data.min(), GMM_data.max(), sample_size)
y1 = np.zeros_like(x1)

# GMM chance distribution
for (l, s), w in zip(norm_params, mixing_prob):
    y1 += stats.norm.pdf(x1, loc=l, scale=s) * w

# Plot the GMM chance distribution versus the information histogram
fig1, ax = plt.subplots()
ax.hist(GMM_data, bins=50, density=True, label="GMM knowledge histogram", 
        colour = GRAY9)
ax.plot(x1, p1*stats.norm(loc=mu, scale=sigma_1).pdf(x1),
        label="p1 × first PDF",colour = GREEN1,linewidth=3.0)
ax.plot(x1, (1-p1)*stats.norm(loc=mu, scale=sigma_2).pdf(x1),
        label="(1-p1) × second PDF",colour = ORANGE1,linewidth=3.0)
ax.plot(x1, y1, label="GMM distribution (PDF)",colour = BLUE2,linewidth=3.0)

ax.set_title("Knowledge histogram vs. true distribution", fontsize=14, loc="left")
ax.set_xlabel('Knowledge worth')
ax.set_ylabel('Likelihood')
ax.legend()
ax.grid()

Danach berechnen wir die Schätzung des Mischparameters P1, den wir früher mit Mama abgeleitet haben und die hier unten als Referenz erneut angezeigt wird.

Der Python -Code, mit dem die obige Gleichung unter Verwendung unserer GMM -Beispieldaten berechnet wird, ist unten angezeigt.

# Estimate the blending parameter p1 from the pattern knowledge utilizing MoM estimator
p1_hat = (sum(pow(x,2) for x in GMM_data) / len(GMM_data) - pow(sigma_2,2))
         /(pow(sigma_1,2) - pow(sigma_2,2))

Um diesen Schätzer ordnungsgemäß zu bewerten, verwenden wir Monte Carlo Simulation durch Generieren mehrerer Realisierungen der GMM -Daten und schätzen P1 für jede Realisierung, wie im folgenden Python -Code gezeigt.

# Monte Carlo simulation of the MoM estimator
num_monte_carlo_iterations = 500
p1_est = np.zeros((num_monte_carlo_iterations,1))

sample_size = 1000
p1 = 0.2 # chance that the information level comes from first gaussian
mixing_prob = (p1, (1-p1))
# A stream of indices from which to decide on the element
GMM_idx = np.random.alternative(len(mixing_prob), dimension=sample_size, change=True, 
          p=mixing_prob)
for iteration in vary(num_monte_carlo_iterations):
  sample_data = np.fromiter((stats.norm.rvs(*(norm_params(i))) for i in GMM_idx))
  p1_est(iteration) = (sum(pow(x,2) for x in sample_data)/len(sample_data) 
                       - pow(sigma_2,2))/(pow(sigma_1,2) - pow(sigma_2,2))

Anschließend prüfen wir nach der Verzerrung und Varianz unseres Schätzers und vergleichen sich mit den theoretischen Ergebnissen, die wir zuvor wie unten gezeigt abgeleitet haben.

p1_est_mean = np.imply(p1_est)
p1_est_var = np.sum((p1_est-p1_est_mean)**2)/num_monte_carlo_iterations
p1_theoritical_var_num = 3*p1*pow(sigma_1,4) + 3*(1-p1)*pow(sigma_2,4) 
                         - pow(p1*pow(sigma_1,2) + (1-p1)*pow(sigma_2,2),2)
p1_theoritical_var_den = sample_size*pow(sigma_1**2-sigma_2**2,2)
p1_theoritical_var = p1_theoritical_var_num/p1_theoritical_var_den
print('Pattern variance of MoM estimator of p1 = %.6f' % p1_est_var)
print('Theoretical variance of MoM estimator of p1 = %.6f' % p1_theoritical_var)
print('Imply of MoM estimator of p1 = %.6f' % p1_est_mean)

# Under are the outcomes of the above code
Pattern variance of MoM estimator of p1 = 0.001876
Theoretical variance of MoM estimator of p1 = 0.001897
Imply of MoM estimator of p1 = 0.205141

Wir können aus den oben genannten Ergebnissen beobachten, dass der Mittelwert der P1 -Schätzung 0,2051 entspricht, was dem wahren Parameter P1 = 0,2 sehr nahe liegt. Dieser Mittelwert kommt dem wahren Parameter mit zunehmender Probengröße noch näher. Somit haben wir numerisch gezeigt, dass der Schätzer ist unvoreingenommen wie die theoretischen Ergebnisse zuvor bestätigt.

Darüber hinaus ist die Stichprobenvarianz des P1 -Schätzers (0,001876) nahezu identisch mit der theoretischen Varianz (0,001897), die schön ist.

Es ist immer ein glücklicher Second, wenn Theorie der Praxis entspricht!

Alle Bilder in diesem Artikel werden vom Autor, sofern nicht anders angegeben, vom Autor.


Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert