[PYTHON] Sequentielle Aktualisierung der Co-Distribution zur Ableitung und Implementierung von Ausdrücken

Auslösen

Ein Mitglied desselben Labors fragte mich, ob ich die verteilte, gemeinsam verteilte Matrix nacheinander aktualisieren möchte, aber gibt es einen guten Weg? Ich habe diesen Artikel gefunden. Hier werden die Formeln abgeleitet, die sich auf die sequentielle Aktualisierung von Mittelwert und Verteilung beziehen. Weitere Informationen zu diesem Teil finden Sie auf der entsprechenden Website. Hier werden wir einen Ausdruck im Zusammenhang mit der Co-Verteilung ableiten, der auf dieser Site nicht im Detail erwähnt wurde, und die Verteilung-Co-Verteilungsmatrix in Python3 berechnen.

Ableitung der Kovarianz

Bestätigung von Zeichen und wichtigen Ausdrücken

Notieren Sie sich die Zeichen und relationalen Ausdrücke, die vor dem Ableiten verwendet werden sollen. Es verändert sich ziemlich stark. Wenn Sie es also nicht verstehen, während Sie der Formel folgen, kommen Sie bitte hierher zurück und denken Sie darüber nach.

Daten x=(x_1,x_2,\ ...\ ,x_n),\ y=(y_1,y_2,\ ...\ ,y_n)

Durchschnitt der Daten \overline{x_n}=\frac{1}{n}\sum_{i=1}^nx_i\ ,\ \overline{y_n}=\frac{1}{n}\sum_{i=1}^ny_i

Mitverteilt s_{xy}^{n}=\frac{1}{n}\sum_{i=1}^n{\left(x_i\ -\ \overline{x_n}\ \right)\left(y_i\ -\ \overline{y_n}\ \right)}

Allmähliche Formel für den Mittelwert \overline{x_{n+1}}\ -\ \overline{x_{n}}\ =\ \frac{1}{n+1}\left(x_{n+1}\ -\ \overline{x_n}\right)\cdots\star

Ableitung der allmählichen Kovarianzgleichung

Nun zum Hauptthema! Ich werde von hier aus mit der Formel spielen, aber bitte haben Sie etwas Geduld! Berechnen Sie $ M_ {n + 1} -M_n $ mit $ M_n = ns_ {xy} ^ n $. Wenn dies erhalten wird, kann die allmähliche Kovarianzgleichung leicht erhalten werden.

\begin{align}
M_{n+1}-M_n &= \sum_{i=1}^{n+1}\left(x_i\ -\ \overline{x_{n+1}}\ \right)\left(y_i\ -\ \overline{y_{n+1}}\ \right) -\sum_{i=1}^n\left(x_i\ -\ \overline{x_n}\ \right)\left(y_i\ -\ \overline{y_n}\ \right)\\
            &= \sum_{i=1}^{n+1}\left(x_iy_i\ -\ x_i\overline{y_{n+1}}\ -\ \overline{x_{n+1}}y_i\ +\ \overline{x_{n+1}}\ \overline{y_{n+1}}\right)\\
            &\ -\sum_{i=1}^n\left(x_iy_i\ -\ x_i\overline{y_{n}}\ -\ \overline{x_{n}}y_i\ +\ \overline{x_{n}}\ \overline{y_{n}}\right)\\
            &=x_{n+1}y_{n+1}\ +\ (n+1)\overline{x_{n+1}}\ \overline{y_{n+1}}\ -\ n\overline{x_n}\ \overline{y_n}\\
            &\ -\underline{\left(\overline{y_{n+1}}\sum_{i=1}^{n+1}x_i\ +\ \overline{x_{n+1}}\sum_{i=1}^{n+1}y_i\ -\ \overline{y_{n}}\sum_{i=1}^nx_i\ -\ \overline{x_{n}}\sum_{i=1}^ny_i\right)}\cdots\ast
\end{align}

Übrigens, ist es soweit in Ordnung? Berechnen wir hier mit dem unterstrichenen Teil als (1). Der Einfachheit halber werden die folgenden zwei Zeichen eingeführt. A_n=\sum_{i=1}^nx_i\ ,\ B_n=\sum_{i=1}^ny_i Lassen Sie uns (1) loswerden!

\begin{align}
(1) &=\overline{y_{n+1}}\ A_{n+1}\ +\ \overline{x_{n+1}}\ B_{n+1}\ -\ \overline{y_n}\ A_n\ -\ \overline{x_n}\ B_n\\
    &=2\left(\frac{1}{n+1}A_{n+1}B_{n+1}\ -\ \frac{1}{n}A_nB_n\right)\\
    &=2\left\{(n+1)\ \overline{x_{n+1}}\ \overline{y_{n+1}}\ -\ n\ \overline{x_n}\ \overline{y_n}\right\}
\end{align}

Ja, es ist sauber! Ersetzen wir dies durch den unterstrichenen Teil.

\begin{align}
\ast&=x_{n+1}y_{n+1}\ +\ (n+1)\ \overline{x_{n+1}}\ \overline{y_{n+1}}\ -\ n\ \overline{x_n}\ \overline{y_n}-2\left\{(n+1)\ \overline{x_{n+1}}\ \overline{y_{n+1}}\ -\ n\ \overline{x_n}\ \overline{y_n}\right\}\\
    &=x_{n+1}y_{n+1}\ -(n+1)\ \overline{x_{n+1}}\ \overline{y_{n+1}}\ +\ n\ \overline{x_n}\ \overline{y_n}\\
    &=x_{n+1}y_{n+1}\ -(n+1)\underline{\left(\overline{x_{n+1}}\ \overline{y_{n+1}}\ -\ \overline{x_n}\ \overline{y_n}\right)}\ -\ \overline{x_n}\ \overline{y_n}\cdots\ast\ast
\end{align}

Die zweite Unterstreichung. Wir werden hier als (2) berechnen.

\begin{align}
(2)&=\left(\overline{x_{n+1}}\ -\ \overline{x_n}\right)\left(\overline{y_{n+1}}\ -\ \overline{y_n}\right)+\overline{x_{n+1}}\ \overline{y_n}+\overline{x_{n}}\ \overline{y_{n+1}}\ -2\ \overline{x_{n}}\ \overline{y_n}\\
   &=\left(\overline{x_{n+1}}\ -\ \overline{x_n}\right)\left(\overline{y_{n+1}}\ -\ \overline{y_n}\right)+\overline{y_n}\left(\overline{x_{n+1}}\ -\overline{x_n}\right)+\overline{x_n}\left(\overline{y_{n+1}}\ -\overline{y_n}\right)\\
   &=\frac{x_{n+1}-\overline{x_n}}{n+1}\cdot \frac{y_{n+1}-\overline{y_n}}{n+1}+ \overline{y_n}\ \frac{x_{n+1}-\overline{x_n}}{n+1}+\overline{x_n}\ \frac{y_{n+1}-\overline{y_n}}{n+1}\ (\because\ \star)\\
   &=\frac{1}{n+1}\left\{ \frac{1}{n+1}\left(x_{n+1}-\overline{x_n}\right)\left(y_{n+1}-\overline{y_n}\right)+\overline{y_n}\ \left(x_{n+1}-\overline{x_n}\right)+\overline{x_n}\ \left(y_{n+1}-\overline{y_n}\right)\right\}
\end{align}

Das Ziel ist gleich um die Ecke!

\begin{align}
\ast\ast&=x_{n+1}y_{n+1}\ -\frac{1}{n+1}\left(x_{n+1}-\overline{x_n}\right)\left(y_{n+1}-\overline{y_n}\right)-\overline{y_n}\ \left(x_{n+1}-\overline{x_n}\right)-\overline{x_n}\ \left(y_{n+1}-\overline{y_n}\right)-\overline{x_n}\ \overline{y_n}\\
        &=\frac{n}{n+1}\ x_{n+1}y_{n+1}\ -\ \frac{n}{n+1}\ x_{n+1}\overline{y_n}\ -\ \frac{n}{n+1}\ \overline{x_n}\ y_{n+1}\ +\frac{n}{n+1}\ \overline{x_n}\ \overline{y_n}\\
        &=\frac{n}{n+1}\ \left(x_{n+1}\ -\ \overline{x_n}\right)\ \left(y_{n+1}\ -\ \overline{y_n}\right)
\end{align}

Damit ist die Haupttransformation abgeschlossen. Ich werde das endgültige Finish machen.

M_{n+1}-M_n=\frac{n}{n+1}\left(x_{n+1}\ -\ \overline{x_n}\right)\left(y_{n+1}\ -\ \overline{y_n}\right)\\
\therefore\ M_{n+1} = \frac{n}{n+1}\left(x_{n+1}\ -\ \overline{x_n}\right)\left(y_{n+1}\ -\ \overline{y_n}\right)\ +\ M_n\\
\therefore\ s_{xy}^{n+1}\ =\ \frac{n}{(n+1)^2}\left(x_{n+1}\ -\ \overline{x_n}\right)\left(y_{n+1}\ -\ \overline{y_n}\right)\ +\ \frac{n}{n+1}s_{xy}^n

Dies vervollständigt die schrittweise Formel.

In Python implementiert

Nachdem wir nun einen allmählichen Ausdruck haben, implementieren wir ihn tatsächlich in Python. Dieses Mal werden wir es unter der Motivation implementieren, dass "Vektoren sequentiell gegeben werden und wir die Varianz-Co-Verteilungsmatrix des Vektorsatzes finden wollen".

import numpy as np

def calc(next_val,times,var_cov_mat=None):
    '''
Mach die Berechnung
    '''
    if times > 1:
        #Aktualisierung der Verteilungs-Co-Verteilungsmatrix
        var_cov_mat = np.outer(next_val,n_mean)*(times/(times+1)**2) + var_cov_mat*times/(times+1)
    else:
        #Definieren Sie den Anfangszustand, verteilte co-verteilte Matrix = Einheitsmatrix
        var_cov_mat = np.identity(len(next_val))

    return next_mean, var_cov_mat

Damit ist der Vorgang abgeschlossen. Danach können Sie die verteilte, gemeinsam verteilte Matrix nacheinander abrufen, indem Sie immer mehr Daten einfügen.

Überprüfung

Dieses Mal werden wir einen 512-dimensionalen Vektor verwenden. Jede Komponente des Vektors erhielt zufällig eine Zahl größer oder gleich 0 und kleiner als 1. Das Vergleichsverfahren besteht darin, den Übergang des durchschnittlichen quadratischen Fehlers für jede Komponente der Matrix, die durch das obige Verfahren erhalten wurde, und der Matrix, die einmal durch numpy berechnet wurde, zu untersuchen. Klicken Sie hier für die Ergebnisse. MSE_test3.png

Die 500-fache Berechnung wird in etwas mehr als 4 Sekunden durchgeführt und geht auf etwa 0,06 über.

Zusammenfassung

Dieses Mal haben wir einen schrittweisen Ausdruck für die gemeinsame Verteilung abgeleitet, der die sequentielle Aktualisierung der gemeinsamen Verteilung ermöglicht, und ihn in Python implementiert. Ich denke, dass die Berechnungsergebnisse ordentlich geschrieben sind, aber wenn jemand sagt "Ich könnte es schöner schreiben!", Lassen Sie es mich bitte wissen. In Bezug auf die Implementierung habe ich, wie ich in der ersten Einführung geschrieben habe, an der Stelle begonnen, an der ich die Konsultation erhalten habe, und ich implementiere sie in einer Form, die den Inhalt der Konsultation widerspiegelt, die ich erhalten habe. Wenn Sie sie also in einer anderen Form implementieren möchten, in der ersten Hälfte Ich hoffe, Sie können es mit dem Ausdrucksteil implementieren.

Von hier an hat es nichts mehr mit der Hauptlinie zu tun, aber diese Formeltransformation war ziemlich schwierig. Wenn Sie an einer Formeltransformation interessiert sind, ist es möglicherweise eine gute Idee, die Löcher im obigen Teil auszufüllen. Ich wollte es sehr sorgfältig ausfüllen. Wenn Sie also der Meinung sind, dass es keinen Platz zum Ausfüllen gibt, kann es interessant sein, es von Anfang an selbst zu berechnen.

Referenzierte Site

Sequentielle Aktualisierung der Verteilung

Recommended Posts

Sequentielle Aktualisierung der Co-Distribution zur Ableitung und Implementierung von Ausdrücken
Erklärung und Implementierung von SocialFoceModel
Erläuterung und Implementierung von PRML Kapitel 4
Einführung und Implementierung von JoCoR-Loss (CVPR2020)
Erklärung und Implementierung des ESIM-Algorithmus
Einführung und Implementierung der Aktivierungsfunktion
Erklärung und Implementierung von einfachem Perzeptron
Ableitung der multivariaten t-Verteilung und Implementierung der Zufallszahlengenerierung durch Python
Implementierung des Partikelfilters durch Python und Anwendung auf das Zustandsraummodell
Implementierung und Experiment der konvexen Clustering-Methode
Erklärung und Implementierung des Decomposable Attention-Algorithmus
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
Erstellen Sie eine Python-Umgebung, um die Theorie und Implementierung von Deep Learning zu erlernen
Ich habe versucht, Slack über das Update von Redmine zu informieren
Vergleichen Sie die Implementierungsbeispiele für scikit-learn und pyclustering k-means
Skript zum Twittern mit Vielfachen von 3 und Zahlen mit 3 !!
TRIE-Baumimplementierung mit Python und LOUDS
Liste des zu verschiebenden und zu merkenden Python-Codes
Erläuterung der Bearbeitungsentfernung und Implementierung in Python
[Einführung in Python] Grundlegende Verwendung von Lambda-Ausdrücken
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.