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.
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
Durchschnitt der Daten
Mitverteilt
Allmähliche Formel für den Mittelwert
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.
\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.
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.
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.
Die 500-fache Berechnung wird in etwas mehr als 4 Sekunden durchgeführt und geht auf etwa 0,06 über.
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.