[PYTHON] [Nicht parametrische Felder] Schätzen der Anzahl von Clustern mithilfe des Diricle-Prozesses

Überblick

Hallo, das ist Kwashi. Mit der Popularität des maschinellen Lernens steigt auch der Bereich des unbeaufsichtigten Lernens. Apropos unbeaufsichtigtes Lernen, das Themenmodell ist berühmt. Das Themenmodell ist eine Technik zur Schätzung der möglichen Bedeutung. Dies dient unter anderem dazu, potenzielle Bedeutungen zu ermitteln, z. B. Kategorien von Nachrichtenartikeln. In diesem Themenmodell wird die Themenverteilung (Anzahl der Kategorien) jedes Dokuments mithilfe des Diricle-Prozesses erfasst.

Darüber hinaus werde ich ein Papier zur Trennung von Schallquellen vorstellen, aber Bayesian Nonparametrics for Microphone Array Processing wird von mehreren Schallquellen über mehrere Mikrofone (Mikrofonarray) eingegeben. , Erklärt die Methode zur Schätzung der Schallquellenrichtung + des getrennten Schalls. Wie im Thema dieses Dokuments erwähnt, wird die Anzahl der Schallquellen im Dilikle-Prozess unter Verwendung nicht parametrischer Felder berechnet. Die Anzahl der Schallquellen ist sehr wichtig. Dies liegt daran, dass es einen Hinweis darauf gibt, wie viele separate Sounds generiert werden sollen.

In diesem Artikel werden wir anhand eines Beispiels erklären, wie der Durchschnitt und die Varianz der Anzahl der Cluster und die Normalverteilung unter Verwendung des Diricle-Prozesses als nichtparametrische Felder gleichzeitig geschätzt werden.

Zweck

In diesem Artikel werden der Mittelwert und die Varianz jeder Normalverteilung aus den Trainingsdaten berechnet, die aus der folgenden gemischten Normalverteilung generiert wurden. Zunächst wird erläutert, wie jede Normalverteilung mit der angegebenen Anzahl von Clustern geschätzt wird, und anschließend, wie die Anzahl der Cluster gleichzeitig geschätzt wird.

Die Werte für jede Normalverteilung sind Mittelwert (-8, 0, 4), Varianz (1,8, 1,5, 1,3) und Normalverteilungsmix (0,2, 0,5, 0,3). Die folgende Abbildung zeigt die erzeugte Wahrscheinlichkeitsdichteverteilung (grüne Linie) und die Häufigkeit der generierten Daten. Es beschreibt auch ein gemischtes Normalverteilungs- und Datenerzeugungsprogramm.

img001.png


import pymc3 as pm
import numpy as np
import theano.tensor as tt
import scipy.stats as stats
from scipy import optimize
import matplotlib.pyplot as plt

np.random.seed(53536)

xmin = -15.
xmax = 10.
xsize = 200
x = np.linspace(xmin, xmax, xsize)
pi_k = np.array([0.2, 0.5, 0.3])
loc_x = np.array([-8, 0, 4])

norm1 = stats.norm.pdf(x, loc=loc_x[0], scale=1.8) * pi_k[0]
norm2 = stats.norm.pdf(x, loc=loc_x[1], scale=1.5) * pi_k[1]
norm3 = stats.norm.pdf(x, loc=loc_x[2], scale=1.3) * pi_k[2]

npdf = norm1 + norm2 + norm3
npdf /= npdf.sum()

#Wert nach der Wahrscheinlichkeit der Wahrscheinlichkeitsverteilung(x)Erhalten
y = np.random.choice(x, size=4000, p=npdf)

Feste Anzahl von Clustern Normalverteilungsschätzung

In diesem Kapitel erklären wir, wie der Mittelwert und die Varianz der drei Normalverteilungen geschätzt werden, wobei die Anzahl der Cluster im Voraus auf drei festgelegt wird. Es gibt viele Methoden zum Schätzen der Parameter der Normalverteilung mit der Anzahl der bestimmten Cluster, wie z. B. den EM-Algorithmus, Variant Bayes und Markov-Ketten-Monte-Carlo-Methoden (MCMC). In diesem Kapitel wird MCMC verwendet.

Das Normalverteilungsgenerierungsmodell ist wie im folgenden Programm gezeigt. Die kategoriale Verteilung generiert eine ID (z), die angibt, zu welcher Gruppe die einzelnen Daten gehören, wobei das Mischungsverhältnis jeder aus der Diricre-Verteilung generierten Normalverteilung als Parameter verwendet wird. Danach legen wir für jede Normalverteilung die Verteilung fest, die den Mittelwert und die Varianz verdient.

with pm.Model() as model:
  p = pm.Dirichlet('p', a=np.ones(cluster))
  z = pm.Categorical('z', p=p, shape=y.shape[0])

  mu = pm.Normal('mu', mu=y.mean(), sd=10, shape=cluster)
  sd = pm.HalfNormal('sd', sd=10, shape=cluster)

  y = pm.Normal('y', mu=mu[z], sd=sd[z], observed=y)

  trace = pm.sample(1000)

Dieses Modell lässt sich jedoch aufgrund der versteckten Variablen z nur langsam berechnen. Daher Peripherisierung(∫p(y|z,θ)dz -> p(y|θ))Und ändern Sie das Programm wie folgt.

with pm.Model() as model:
  p = pm.Dirichlet('p', a=np.ones(cluster))
  mu = pm.Normal('mu', mu=y.mean(), sd=10, shape=cluster)
  sd = pm.HalfNormal('sd', sd=10, shape=cluster)

  y = pm.NormalMixture('y', w=p, mu=mu, sd=sd, observed=y)

  trace = pm.sample(3000, chains=1)

Das Ergebnis der Inferenz ist in der folgenden Abbildung dargestellt. Der Mittelwert (-8, 0, 4) (mu), die Varianz (1,8, 1,5, 1,3) (sd) jeder Normalverteilung und das Mischungsverhältnis (0,2, 0,5, 0,3) (p) der Normalverteilung sind gut geschätzt. Kann gesehen werden.

img002.png

Anzahl unbekannter Cluster Normalverteilungsschätzung

Im vorherigen Kapitel haben wir die Parameter der Normalverteilung unter der Annahme geschätzt, dass die Anzahl der Cluster bekannt ist. In diesem Kapitel erklären wir die Schätzung der Normalverteilungsparameter, wenn die Anzahl der Cluster unbekannt ist, indem wir den Diricle-Prozess einführen. In diesem Kapitel wird der Erläuterung des Bildes des Dirikure-Prozesses Priorität eingeräumt. Einzelheiten zum Dirikure-Prozess finden Sie unter [Fortsetzung / Leicht verständliche Mustererkennung - Einführung in das Lernen ohne Lehrer](https://www.amazon.co.jp/%E7%B6%9A%E3%83%BB%E3%82%8F%] E3% 81% 8B% E3% 82% 8A% E3% 82% 84% E3% 81% 99% E3% 81% 84% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E8% AA% 8D% E8% AD% 98% E2% 80% 95% E6% 95% 99% E5% B8% AB% E3% 81% AA% E3% 81% 97% E5% AD% A6% E7% BF% 92% E5% 85% A5% E9% 96% 80% E2% 80% 95-% E7% 9F% B3% E4% BA% 95-% E5% 81% A5% E4% B8% 80% E9% 83% 8E / dp / 427421530X) ist sehr hilfreich, also lesen Sie es bitte.

Um den Diricle-Prozess (DP) kurz zu erklären, werden H ~ DP (a, H '), a durch den Konzentrationsgrad (bildähnliche Dispersion) und H (Basisverteilung; bildähnlicher Mittelwert) sowie durch DP dargestellt. Verteilung H wird erzeugt. Aus diesem Grund wird es manchmal als Verteilung in Bezug auf die Verteilung bezeichnet. In meinem persönlichen Bild wird die Regressionsfunktion selbst durch den Gaußschen Prozess abgeleitet, wie in Zurückgeben mit dem Gaußschen Prozess angegeben. Das Bild ist, dass der Diricle-Prozess auch die Verteilung selbst leitet.

Übrigens gibt es den chinesischen Kochprozess (CRP) und den Stick Breaking Prozess (SBP) als Methode, um diesen Dirikure-Prozess zu realisieren. In diesem Kapitel erklären wir die Methode mit diesem SBP. SBP wird durch die folgende Formel ausgedrückt. K ist die Anzahl der Verteilungen. Wenn K unendlich ist, kann die unendlich dimensionale Diricre-Verteilung in SBP angezeigt werden. (Setzen Sie K im tatsächlichen Gebrauch auf eine endliche Konstante.)

{\pi_k = b_k \prod_{j=1}^{K-1} (1-b_j),\,b_k \sim {\rm Beta}(b;1,\alpha) } 

Das Ergebnis π dieser Gleichung ist das Mischungsverhältnis des Clusters k. Das Programm und die Ergebnisse dieses SBP sind unten gezeigt. Dieser SPB allein kann jedoch den Durchschnitt der Verteilung nicht berechnen. Daher wird der Wert aus der Basisverteilung wie in der folgenden Formel gezeigt generiert und auf der horizontalen Achse festgelegt.

{  \theta _ { k } \sim H _ { 0 } , \text { for } k = 1 , \ldots , K } 

Die folgende Abbildung zeigt, welches Mischungsverhältnis an jeder Position erzeugt wurde. Wenn a klein ist, ist es in der Mitte konzentriert, aber wenn a groß ist, können Sie sehen, dass es draußen verstreut ist. img007.png

def stick_breaking(a, h, k):
  '''
  a:Konzentration
  h:Basisverteilung(scipy dist)
  K:Anzahl der Komponenten

  Return
  locs :Position(array)
  w:Wahrscheinlichkeit(array)
  '''
  s = stats.beta.rvs(1, a, size=K)
 #ex : [0.02760315 0.1358357  0.02517414 0.11310199 0.21462781]
  w = np.empty(K)
  w = s * np.concatenate(([1.], np.cumprod(1 - s[:-1])))
  #ex: 0.02760315 0.13208621 0.0211541  0.09264824 0.15592888]
  # if i == 1, s , elif i > 1, s∑(1-sj) (j 1 -> i-1)

  locs = H.rvs(size=K)
  return locs, w

Als nächstes wird die Normalverteilung gezeigt, die durch das von SPB erzeugte Mischungsverhältnis ausgedrückt wird, wenn K = 5 ist, und der Mittelwert, der aus der Basisverteilung (Normalverteilung) erzeugt wird. Die Verteilung ist konstant. Wie in dieser Figur gezeigt, kann gesehen werden, dass jede gemischte Normalverteilung durch Ändern des SPB-Parameters a und der Basisverteilung ausgedrückt werden kann. imga_1.png

Basierend auf der Tatsache, dass das Mischungsverhältnis von SPB auf diese Weise erzeugt wird, werden wir nun den Normalverteilungsparameter schätzen, wenn die Anzahl der Cluster unbekannt ist. Ich habe das folgende Programm nach dem Format von pymc geschrieben. Nur das Mischungsverhältnis wird von SPB ausgegeben. Zusätzlich wird der Hyperparameter a von SPB aus der Gammaverteilung generiert. Der Mittelwert und die Varianz werden aus der Normalverteilung erzeugt. K wird auf eine endliche Zahl (20) gesetzt.

def stick_breaking_DP(a, K):
  b = pm.Beta('B', 1., a, shape=K)
  w = b * pm.math.concatenate([[1.], tt.extra_ops.cumprod(1. - b)[:-1]])
  return w

K = 20

with pm.Model() as model:
  a = pm.Gamma('a', 1., 1.)
  w = pm.Deterministic('w', stick_breaking_DP(a, K))
  mu = pm.Normal('mu', mu=y.mean(), sd=10, shape=K)
  sd = pm.HalfNormal('sd', sd=10, shape=K)

  y = pm.NormalMixture('y', w=w, mu=mu, sd=sd, observed=y)

  trace = pm.sample(1000, chains=1)

Die geschätzten Mischungszahlen sind unten gezeigt. Auf diese Weise kann geschätzt werden, dass es 3 Cluster gibt, da das Mischungsverhältnis mit einem großen Wert 3 beträgt. (Die tatsächlichen Werte sind 0,2, 0,5, 0,3.) Auch die anderen Mittelwerte und Verteilungen waren fast dieselben wie bei Clustern. Wichtig hierbei ist, dass wir beide Cluster schätzen können.

img006.png

Zusammenfassung

In diesem Artikel haben wir als nicht parametrische Felder eine Methode zum Schätzen der Anzahl von Clustern unter Verwendung des Diricle-Prozesses gleichzeitig mit dem Schätzen der Normalverteilung erläutert. Da die Erklärung mit Priorität auf dem Bild gegeben wurde, fühlen sich einige Menschen möglicherweise unwohl, aber in diesem Fall danke ich Ihnen für Ihre Anleitung.

Recommended Posts

[Nicht parametrische Felder] Schätzen der Anzahl von Clustern mithilfe des Diricle-Prozesses
Abschätzung der Wirkung von Maßnahmen anhand von Neigungswerten
Bestimmen Sie die Anzahl der Klassen mithilfe der Starges-Formel
Clustering G-bedeutet, dass die Anzahl der Cluster automatisch bestimmt wird
So finden Sie die optimale Anzahl von Clustern für k-means
10. Zählen der Anzahl der Zeilen
Holen Sie sich die Anzahl der Ziffern
Berechnen Sie die Anzahl der Änderungen
Ich habe die X-Means-Methode untersucht, mit der die Anzahl der Cluster automatisch geschätzt wird
Holen Sie sich die Anzahl der Ansichten von Qiita
Berechnung der Anzahl der Assoziationen von Klamer
Holen Sie sich die Anzahl der Youtube-Abonnenten
So ermitteln Sie die Anzahl der CPUs ohne den Befehl sar
Stellen Sie die Änderung der Anzahl der Keyword-Auftritte pro Monat mithilfe von Pandas grafisch dar
Zählen / überprüfen Sie die Anzahl der Methodenaufrufe.
Implementieren Sie einen Teil des Prozesses in C ++
Verwendung von Gensim mit R (Hierarchical Dirichlet Process)
Legen Sie den Prozessnamen des Python-Programms fest
Zählen Sie die Anzahl der Zeichen mit Echo
[Python] Summiert automatisch die Gesamtzahl der von Qiita mithilfe der API veröffentlichten Artikel
Eine Einführung in die Datenanalyse mit Python - Um die Anzahl der Videoansichten zu erhöhen -