Generiere n korrelierte Pseudozufallszahlen (mit Python-Beispiel)

Vorheriger Artikel generiert $ 2 $ korrelierte Pseudozufallszahlen. tat. Da ich jedoch verschiedene Dinge durchging, wollte ich $ n $ korrelierte Zufallszahlen, daher werde ich erklären, wie man sie generiert.

Dieses Mal beginnen wir mit der Geschichte, plötzlich $ n $ Zufallszahlen zu erstellen. Ich denke, es wäre reibungsloser, zuerst den vorherigen Artikel zu lesen.

PS: Wenn Sie nur korrelierte Zufallszahlen erstellen möchten oder sich nicht für den Hintergrund interessieren, können Sie numpy.random.multivariate_normal verwenden.

Überblick

Wenn es $ n $ Datenreihen gibt, wird die symmetrische Matrix mit den $ i $ -ten und $ j $ -ten Korrelationskoeffizienten in der $ ij $ -Komponente [^ 2], ** Korrelationsmatrix ** genannt. Überlegen Sie, wie Sie diese Korrelationsmatrix als Eingabe verwenden, um $ n $ Zufallszahlen zu generieren, die eine bestimmte Korrelation erfüllen.

Bereiten Sie $ n $ unabhängige Zufallszahlen mit dem Mittelwert Null und der gleichen Varianz vor und kombinieren Sie sie zu einem Vektor, um $ X = (X_1 \ \ X_2 \ \ \ dots \ \ X_n) ^ T $ [^ auszudrücken 1]. Zu diesem Zeitpunkt sind $ n $ Zufallszahlen, die die gleiche Varianz wie $ X_1 $ und $ X_2 $ haben und mit der Korrelationsmatrix $ R $ $ Z = (Z_1 \ \ Z_2 \ \ \ dots \ \ Z_n) ^ korrelieren T $ ist

Z = L \ X \tag{1}

Wird benötigt bei.

Die Korrelationsmatrix hat jedoch den Korrelationskoeffizienten von $ Z_i $ und $ Z_j $ als $ \ rho_ {ij} $.

R = \left( \begin{array}{cccc}
\rho_{11} & \rho_{12} & \dots & \rho_{1n}
\\
\rho_{21} & & &
\\
\vdots & & \ddots & \vdots
\\
\rho_{n1} & & \dots & \rho_{nn}
\end{array} \right) \tag{2}

$ L $ ist also eine untere Dreiecksmatrix (eine Matrix mit allen Nullen in der oberen rechten Ecke der diagonalen Komponente), die aus der Choleski-Zerlegung von $ R $ erhalten wurde.

…… Ja, es mag viele unbekannte Wörter geben, aber bitte seien Sie versichert, dass ich jedes einzelne erklären werde. Lol

Also in diesem Artikel,

Ich werde darüber schreiben.

Ich werde darauf eingehen, was die Choleskey-Zerlegung ist, aber ich werde nicht erklären, wie die Zerlegung tatsächlich erreicht werden kann.

Theorie

Als allgemeiner theoretischer Fluss

  1. Überlegen Sie, wie Sie $ \ {Z_i \} = Z_1, Z_2, \ dots, Z_n $ mit $ \ {X_i \} $ ausdrücken
  2. Verknüpfen Sie den erhaltenen Ausdruck mit dem Korrelationskoeffizienten
  3. Bestätigen Sie den Ausdruck

Es ist wie es ist. Lass uns gehen.

Ideen, um Z zu machen

Für unabhängige Zufallszahlen $ \ {X_i \} $ ist der Mittelwert Null und die Varianz ist dieselbe, $ \ sigma ^ 2 $. Da sie unabhängig sind, sind die Kovarianz $ \ mathrm {Cov} [X_i, X_j] $ und der Korrelationskoeffizient $ \ mathrm {Corr} [X_i, X_j] $ Null.

Ich möchte $ \ {Z_i \} $ mit diesem $ \ {X_i \} $ erstellen, aber vorerst werde ich Folgendes tun.

\begin{align}
Z_1 &= a_{11} X_1 \tag{3.1}
\\
Z_2 &= a_{21} X_1 + a_{22} X_2 \tag{3.2}
\\
Z_3 &= a_{31} X_1 + a_{32} X_2 + a_{33} X_3 \tag{3.3}
\\
&\vdots
\\
Z_n &= a_{n1} X_1 + a_{n2} X_2 + \dots + a_{nn} X_n \tag{3.n}
\end{align}

Dies erzeugt zuerst eine Referenz $ Z_1 $, dann $ Z_2 $ mit einer definierten Korrelation dazu und dann $ Z_1 $ und $ Z_2 $ mit einer definierten Korrelation zu jeder. Es ist ein Bild davon, wie man Z_3 $ macht und den Vorgang zu $ Z_n $ wiederholt. Es ist sehr wichtig, diesen Teil zu verstehen. Ich denke, es ist keine Übertreibung zu sagen, dass es mehr als die Hälfte des theoretischen Teils einnimmt.

Betrachten Sie $ n = 3 $, um das Bild ein wenig verständlicher zu machen. Wenn Sie der Meinung sind, dass das Bild perfekt ist, überspringen Sie diesen Teil.

Korrelation ist die Beziehung zwischen zwei Dingen. Es beginnt nicht ohne einen Standard, über eine Beziehung nachzudenken,

Z_1 = a_{11} X_1 \tag{4}

Ich denke nicht, dass dieser Teil ein Problem ist [^ 3]. Verwenden Sie dann $ Z_1 $ und eine andere Zufallszahl (wählen Sie $ X_2 $).

Z_2 = c Z_1 + a_{22} X_2 \tag{5}

Durch Auswahl des geeigneten Koeffizienten können Sie dann $ Z_2 $ erstellen, das mit $ Z_1 $ und $ \ rho_ {12} $ korreliert. Ich denke, dass es kein Problem gibt, wenn Sie sich den vorherigen Artikel ansehen. Machen Sie die rechte Seite dieses Ausdrucks nur $ \ {X_i \} $

\begin{align}
Z_2 &= c_1 \cdot a_{11} X_1 + a_{22} X_2 & (\because Z_Gleichung 1)
\\
&= a_{21} X_1 + a_{22} X_2 & (\because a_{21} = c_1 \cdot a_{11}Ich sagte) \tag{6}
\end{align}

Jetzt haben Sie die Formel für die zweite Zeile. Schließlich $ Z_3 $, aber da es bereits zwei Zufallszahlen gibt, gibt es verschiedene mögliche Fälle wie folgt.

Um ein breites Spektrum dieser Situationen abzudecken

Z_3 = c_1 Z_1 + c_2 Z_2 + a_{31} X_3
\tag{7}

Und es scheint, dass $ Z_1 $, $ Z_2 $ und eine neue Zufallszahl $ X_3 $ überlagert werden müssen. Wenn $ c_1 $ groß genommen wird, wird Situation 1 genommen, wenn $ c_2 $ groß genommen wird, wird Situation 2 genommen, und wenn $ c_1 = c_2 = 0 $ genommen wird und nur $ a_ {31} $ als eine Zahl genommen wird, wird Situation 3 genommen. Ich denke, ich kann es ausdrücken. Die rechte Seite dieser Gleichung wird auch nur durch $ \ {X_i \} $ dargestellt, und die Gleichung in der dritten Spalte kann durch entsprechende Neudefinition des Koeffizienten abgeleitet werden.

Auf diese Weise stellt sich heraus, dass $ Z_ {i + 1} $ durch Überlagerung der bereits erstellten $ Z_1, Z_2, \ dots, Z_i $ und der neuen Zufallszahl $ X_ {i + 1} $ erstellt werden kann. Ich tat.

Assoziieren Sie mit dem Korrelationskoeffizienten

Wenn Sie nun die Formel zum früheren Auffinden von $ \ {Z_i \} $ als Matrix ausdrücken,

Z = 
\left(
 \begin{array}{ccccc}
    a_{11} & 0 & 0 & \dots & 0
    \\
    a_{21} & a_{22} & 0 & \dots & 0
    \\
    a_{31} & a_{32} & a_{33} & & \vdots
    \\
    \vdots & \vdots & & \ddots & 0
     \\
    a_{n1} & a_{n2} & & \dots & a_{nn}
 \end{array}
\right)X
\tag{8}

Kann geschrieben werden. Dies ist genau die "untere Dreiecksmatrix", die kurz zuvor herausgekommen ist, und es ist eine Matrix, die diagonale Komponenten und Werte unten links enthält und ganz oben rechts mit Nullen gefüllt ist.

Diese Matrix entspricht $ L $, das in $ Z = L \ X $ erscheint. Sobald Sie das wissen, müssen Sie sich nur noch für den Koeffizienten $ \ {a_ {ij} \} $ entscheiden, um die gegebene Korrelation zu erfüllen. Mit anderen Worten, alles, was Sie wissen müssen, ist die Beziehung zwischen $ \ {a_ {ij} \} $ und $ \ {\ rho_ {ij} \} $.

Korrelation zwischen $ Z_i $ und $ Z_j $ Bei $ \ rho_ {ij} $ ist der zu erfüllende Ausdruck

\mathrm{Corr}[Z_i, Z_j] = \rho_{ij}
\tag{9}

nicht wahr. Es tut mir Leid.

Ich kann bei dieser Geschwindigkeit nichts sagen, also werde ich die linke Seite transformieren.

LHS = \frac{\mathrm{Cov}[Z_i, Z_j]}{\sqrt{\mathrm{Var}[Z_i]} \sqrt{\mathrm{Var}[Z_j]}} \ (\because \mathrm{Corr}Definition von)
\tag{10}

Nehmen wir nun das Ergebnis vorweg und lassen Sie $ \ mathrm {Var} [Z_k] = \ sigma ^ 2 \ (\ mathrm {for \ all} \ k) $ zu. Wir gehen davon aus, dass die Verteilung von $ \ {Z_k \} $ mit der Verteilung von $ \ {X_k \} $ übereinstimmt (andernfalls wäre die Berechnung verwirrend). Wir werden dies später numerisch überprüfen.

Die obige Formel lautet also

\frac{\mathrm{Cov}[Z_i, Z_j]}{\sigma^2}
\tag{11}

Es wird sein. Erweitern Sie als Nächstes das Molekül mit $ \ {X_i \} $. Als $ i \ geq j $

\begin{align}
\mathrm{Cov}[Z_i, Z_j] &= \mathrm{Cov}[a_{i1} X_1 + a_{i2} X_2 + \dots + a_{ii} X_i, \ 
a_{j1} X_1 + a_{j2} X_2 + \dots + a_{jj} X_j]
\tag{12}
\end{align}

Aber in $ \ mathrm {Cov} $

\mathrm{Cov}[a A + b B, c C + d D] = ac \mathrm{Cov}[A, C] + ad \mathrm{Cov}[A, D] + bc \mathrm{Cov}[B, C] + bd \mathrm{Cov}[B, D]
\tag{13}

Aufgrund dieser Eigenschaft (untere Buchstaben sind Konstanten und obere Buchstaben sind Zufallszahlen) kann die obige Formel auf die gleiche Weise zerlegt werden. Außerdem ist in diesem Fall $ \ mathrm {Cov} [X_k, X_k] = \ sigma ^ 2 $, $ \ mathrm {Cov} [X_k, X_l] = 0 \ (k \ neq l) $

\begin{align}
\mathrm{Cov}[&a_{i1} X_1 + a_{i2} X_2 + \dots + a_{ii} X_i, \ 
a_{j1} X_1 + a_{j2} X_2 + \dots + a_{jj} X_j]
\\
&= a_{i1} a_{j1} \mathrm{Cov}[X_1, X_1] + a_{i2} a_{j2} \mathrm{Cov}[X_2, X_2] + \dots + a_{ij} a_{jj} \mathrm{Cov}[X_j, X_j]
\\
&\ \ \ \ + a_{i(j+1)} \cdot 0  \cdot \mathrm{Cov}[X_{j+1}, X_{j+1}] + \dots
\\
&= a_{i1} a_{j1} \sigma^2 + a_{i2} a_{j2} \sigma^2 + \dots + a_{ij} a_{jj} \sigma^2
\\
&= (a_{i1} a_{j1} + a_{i2} a_{j2} + \dots + a_{ij} a_{jj}) \ \sigma^2
\tag{14}
\end{align}

Es wird sein. $ a_ {j (j + 1)} = a_ {j (j + 2)} = \ dots = a_ {ji} = 0 $, daher wird der Term am $ j $ th abgeschnitten.

Schließlich ist der Korrelationskoeffizient

\rho_{ij} = \mathrm{Corr}[Z_i, Z_j] = a_{i1} a_{j1} + a_{i2} a_{j2} + \dots + a_{ij} a_{jj}
\tag{15}

Und so sieht es aus.

Da die Berechnung unter der Annahme von $ i \ geq j $ durchgeführt wurde, wurde der untere dreieckige Teil der Korrelationsmatrix berechnet, aber da die Korrelationsmatrix immer symmetrisch ist,

\rho_{ji} = a_{i1} a_{j1} + a_{i2} a_{j2} + \dots + a_{ij} a_{jj}
\tag{16}

Hält auch. Die Indizes auf der linken Seite werden heimlich ersetzt.

"Löse" die Matrix

Um die bisherige Diskussion in Form einer Matrix zusammenzufassen, verwendet die Korrelationsmatrix $ R $ $ \ {a_ij \} $.

R = \left( \begin{array}{cccc}
a_{11} a_{11} & a_{21} a_{11} & \cdots & a_{n1} a_{11}
\\
a_{21} a_{11} & a_{21} a_{21} + a_{22} a_{22} &
\\
\\
\vdots & & \ddots & \vdots
\\
a_{n1} a_{11} & a_{n1} a_{21} + a_{n2} a_{22} & \dots &
\end{array} \right)
\tag{17}

Es kann so ausgedrückt werden. Es gibt zwei Möglichkeiten, $ R $ auszudrücken, eine mit $ \ {\ rho_ {ij} \} $ und die andere mit $ \ {a_ {ij} \} $. Es bedeutet, dass es mit verbunden war. Danach können Sie dies für $ \ {a_ {ij} \} $ lösen.

Zur Bestätigung berechnen wir mit $ n = 2 $. Die Entsprechung zwischen der Korrelationsmatrix und dem Koeffizienten

\left( \begin{array}{cc}
a_{11} a_{11} & a_{21} a_{11}
\\
a_{21} a_{11} & a_{21} a_{21} + a_{22} a_{22}
\end{array} \right)
=
\left( \begin{array}{cc}
\rho_{11} & \rho_{12}
\\
\rho_{21} & \rho_{22}
\end{array} \right)
\tag{18}

ist. Da es sich um eine Korrelationsmatrix handelt, ist $ \ rho_ {11} = \ rho_ {22} = 1 $ und $ \ rho_ {21} = \ rho_ {12} $.

Wenn wir auf dieser Grundlage eine aussagekräftige Formel extrahieren,

\begin{align}
a_{11}^2 &= 1
\tag{19.1}
\\
a_{21} a_{11} &= \rho_{21}
\tag{19.2}
\\
a_{21}^2 + a_{22}^2 &= 1
\tag{19.3}
\end{align}

Und diese drei. Angenommen, $ a_ {kk}> 0 \ (\ mathrm {for \ all} \ k) $. Wenn Sie dies lösen,

\begin{align}
a_{11} &= 1
\tag{20.1}
\\
a_{21} &= \rho_{21}
\tag{20.2}
\\
a_{22} &= \sqrt{1 - \rho_{21}^2}
\tag{20.3}
\end{align}

Dies stimmt mit dem zuletzt erzielten Ergebnis überein. Sieht gut aus.

Was ist also mit allgemeineren $ n $ dimensionalen Matrizen? Schauen wir uns die Prozession noch einmal genauer an. Ich habe versucht, die Zutaten zu erhöhen, um ein bisschen mehr zu schreiben.

R = \left( \begin{array}{ccccc}
a_{11} a_{11} & a_{21} a_{11} & a_{31} a_{11} & \cdots & a_{n1} a_{11}
\\
a_{21} a_{11} & a_{21} a_{21} + a_{22} a_{22} &
a_{31} a_{21} + a_{32} a_{22} &
\\
a_{31} a_{11} & a_{31} a_{21} + a_{32} a_{22} & a_{31} a_{31} + a_{32} a_{32} + a_{33} a_{33} 
\\
\vdots & \vdots & & \ddots & \vdots
\\
a_{n1} a_{11} & a_{n1} a_{21} + a_{n2} a_{22} & \dots &
\end{array} \right)
\tag{21}

Es hat eine ziemlich schöne Form, nicht wahr? Eigentlich das,

R = \left(
 \begin{array}{ccccc}
    a_{11} & 0 & 0 & \dots & 0
    \\
    a_{21} & a_{22} & 0 & \dots & 0
    \\
    a_{31} & a_{32} & a_{33} & & \vdots
    \\
    \vdots & \vdots & & \ddots & 0
     \\
    a_{n1} & a_{n2} & & \dots & a_{nn}
 \end{array}
\right)
\left(
 \begin{array}{ccccc}
    a_{11} & a_{21} & a_{31}  & \dots & a_{n1}
    \\
    0 & a_{22} & a_{32} & \dots & a_{n2}
    \\
    0 & 0 & a_{33} & & 
    \\
    \vdots & \vdots & & \ddots & \vdots
     \\
    0 & 0 & & \dots & a_{nn}
 \end{array}
\right)
\tag{22}

Wäre es nicht überraschend zu sagen, dass es in die Form zerlegt werden kann? In der Tat ist dies wahr, und hier ist Mathematik schön.

Lassen Sie es uns als $ n = 3 $ überprüfen. Die manuelle Berechnung ist schwierig, daher werde ich hier SymPy verwenden. SymPy ist eine Python-Bibliothek, die mathematische Formeln wie Mathematica berechnet.

Versuchen wir, die zerlegte Matrix zu multiplizieren und festzustellen, ob sie zum Original zurückkehrt.

import sympy

# Define symbols
a_11, a_22, a_33 = sympy.symbols('a_11 a_22 a_33', real=True, positive=True)
a_21, a_31, a_32 = sympy.symbols('a_21 a_31 a_32', real=True)

# Define lower and upper triangular matrices
L = sympy.Matrix([
    [a_11, 0, 0], 
    [a_21, a_22, 0], 
    [a_31, a_32, a_33]
    ])
U = L.transpose()

# Calculate product of triangular matrices
R = L * U
print("R = {}".format(R))

Klicken Sie hier für die Ausgabe. Es ist so geformt, dass es leicht zu sehen ist [^ 4].

Ausgabe


R = Matrix([
[a_11**2,     a_11 * a_21,               a_11 * a_31                ],
[a_11 * a_21, a_21**2 + a_22**2,         a_21 * a_31 + a_22 * a_32  ],
[a_11 * a_31, a_21 * a_31 + a_22 * a_32, a_31**2 + a_32**2 + a_33**2]
])

Was! Sie erhalten die Ergebnisse, die Sie erwartet haben!

Um es anders herum auszudrücken, ist die Operation "Zerlegen einer Matrix in das Produkt der unteren Dreiecksmatrix und ihrer Translokation (obere Dreiecksmatrix)" die Choleskey-Zerlegung. Machen wir das auch.

import sympy

# Define symbols
a_11, a_22, a_33 = sympy.symbols('a_11 a_22 a_33', real=True, positive=True)
a_21, a_31, a_32 = sympy.symbols('a_21 a_31 a_32', real=True)

# Define correlation matrix
R = sympy.Matrix([
    [a_11**2,     a_11 * a_21,               a_11 * a_31                ],
    [a_11 * a_21, a_21**2 + a_22**2,         a_21 * a_31 + a_22 * a_32  ],
    [a_11 * a_31, a_21 * a_31 + a_22 * a_32, a_31**2 + a_32**2 + a_33**2]
    ])

# Perform cholesky decomposition
L = R.cholesky()
print("L = {}".format(L))

Ausgabe.

Ausgabe


L = Matrix([
[a_11, 0,    0   ], 
[a_21, a_22, 0   ], 
[a_31, a_32, a_33]
])

Uo, es ist ordentlich! Sie können den Koeffizienten sauber erhalten, indem Sie den Choleskey zerlegen!

Jetzt können Sie sehen, dass die Choleskey-Zerlegung des Korrelationskoeffizienten $ R $ die Matrix ist, die die korrelierten Zufallszahlen erzeugt!

Zusammenfassung der Theorie

Es wird länger, also fasse ich es hier zusammen.

So erstellen Sie korrelierte $ n $ Zufallszahlen:

  1. Bereiten Sie die Korrelationsmatrix $ R $ vor.
  2. Zerlegen Sie $ R $ mit dem Choleskey, um die untere Dreiecksmatrix $ L $ zu finden.
  3. Multiplizieren Sie $ L $ mit dem unkorrelierten Zufallszahlen-Spaltenvektor $ X $ von links und Sie sind fertig!

Die Gliederung hat sich überhaupt nicht geändert, aber Sie sollten eine gute Vorstellung davon haben.

Auch hier werde ich nicht darauf eingehen, wie die Choleskey-Zerlegung berechnet wird. Behandeln Sie es einfach als Black Box, die die Matrix in dreieckige Matrizen zerlegt. Wenn Sie die Berechnungsmethode nachschlagen, werden Sie verschiedene Dinge finden, also verwenden Sie diese bitte.

Überprüfung

Es war eine lange Zeit, aber es wird endlich mit Python3 verifiziert. Basierend auf der vorherigen Überlegung werden wir von Anfang an normale Zufallszahlen verwenden.

import numpy as np
import numpy.random as rand
import matplotlib.pyplot as plt

# Set parameters
n = 3 # The number of random numbers
size = int(1e4) # Size of the vector
r_in = np.matrix([
    [1, 0.2, 0.8],
    [0.2, 1, 0.6],
    [0.8, 0.6, 1]
    ]) # Correlation matrix

# Generate correlated random numbers
l = np.linalg.cholesky(r_in)
x = rand.randn(n, size)
z = l * x

# Calculate stats
cov = np.cov(z)
r_out = np.corrcoef(z)
print("covariance matrix:\n{}\n".format(cov))
print("correlation matrix:\n{}\n".format(r_out))

# Plot results
fig, ax = plt.subplots()
ax.scatter(z[0, :], z[1, :], s=1, color='red', label='Z_2')
ax.scatter(z[0, :], z[2, :], s=1, color='blue', label='Z_3')
ax.set_xlabel('Z_1')
ax.set_ylabel('Z_2, Z_3')
ax.legend()
plt.show()

Dies ist die Ausgabe.

Ausgabe


covariance matrix:
[[ 1.00545504  0.19297604  0.79517079]
 [ 0.19297604  1.00391907  0.5943957 ]
 [ 0.79517079  0.5943957   0.99000159]]

correlation matrix:
[[ 1.          0.19207582  0.79700517]
 [ 0.19207582  1.          0.5962225 ]
 [ 0.79700517  0.5962225   1.        ]]

Die diagonale Komponente der Kovarianzmatrix ist die Varianz. Da der Wert nahe an der Verteilung $ 1 $ liegt, die der ursprünglichen normalen Zufallszahl entspricht, ist die Verteilung von "$ \ {Z_i \} $ gleich $ \ {X_i \} $". Die Annahme scheint kein Problem zu sein.

Außerdem werden in der Korrelationsmatrix Zahlen angezeigt, die nahe an den Werten liegen, die ordnungsgemäß eingegeben wurden.

Klicken Sie hier für eine Darstellung von $ Z_2 $ und $ Z_3 $ gegen $ Z_1 $. rho12_0p2_rho13_0p8_rho23_0p6.png Es wird richtig reflektiert, dass wir eine starke Korrelation in $ \ rho_ {13} $ setzen!

Was ist also mit einer solchen Korrelationsmatrix? Sie möchten auch die negative Korrelation sehen.

r_in = np.matrix([
    [1, -0.2, -0.8],
    [-0.2, 1, -0.6],
    [-0.8, -0.6, 1]
    ]) # Correlation matrix

Wenn du rennst ...

Ausgabe


Traceback (most recent call last):
  File "spike.py", line 15, in <module>
    l = np.linalg.cholesky(r_in)
  File "/Users/horiem/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/numpy/linalg/linalg.py", line 612, in cholesky
    r = gufunc(a, signature=signature, extobj=extobj)
  File "/Users/horiem/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/site-packages/numpy/linalg/linalg.py", line 93, in _raise_linalgerror_nonposdef
    raise LinAlgError("Matrix is not positive definite")
numpy.linalg.linalg.LinAlgError: Matrix is not positive definite

shell returned 1

Hoppla, ich habe einen Fehler erhalten (und festgestellt, dass ich Pyenv und Anaconda verwendet habe). Anscheinend ist die Demontage von Koleskey fehlgeschlagen. Du bist wütend auf "Matrix ist nicht positiv definitiv".

Ja, damit die Choleskey-Zerlegung möglich ist, lautet die Zielmatrix:

Ich brauche das.

Was ist eine positive Wertematrix? Für jeden Nicht-Null-Vektor $ \ boldsymbol {z} $

\boldsymbol{z}^T M \boldsymbol{z} > 0

Es ist eine symmetrische Matrix $ M $, so dass [^ 5].

Es gibt einen guten Weg für diejenigen, die nicht jeden einzelnen von ihnen überprüfen können. "Die Matrix $ M $ ist ein positiver Wert" und "Die eindeutigen Werte der Matrix $ M $ sind alle positiv" sind der gleiche Wert. Überprüfen wir also das Vorzeichen des Eigenwerts.

r_in = np.matrix([
    [1, -0.2, -0.8],
    [-0.2, 1, -0.6],
    [-0.8, -0.6, 1]
    ]) # Correlation matrix

w, v = np.linalg.eig(r_in)
print(w)

Ausgabe


[-0.10192577  1.19135241  1.91057336]

Oh, schließlich gibt es einen negativen Eigenwert. Dies kann nicht zerlegt werden.

Wenn es eine negative Korrelation gibt, können Sie den Choleskey dann nicht zerlegen? Nein, ist es nicht.

Tatsächlich hat jede Korrelationsmatrix ursprünglich [nicht negative Deterministik (semi-positive Qualität)](http://mathtrain.jp/correlationmatrix "Beziehung zwischen der Definition der Korrelationsmatrix und der Varianz-Kovarianz-Matrix | Schöne Geschichte der Mathematik der High School" "). Nicht negative Qualität ist, wenn Null in der positiven Qualitätsbedingung enthalten ist. Mit anderen Worten ist der Eigenwert Null oder positiv. Ein Beispiel, das einen Eigenwert von Null enthält

\left( \begin{array}{ccc}
1 & 1 & -1
\\
1 & 1 & -1
\\
-1 & -1 & 1
\end{array} \right)

Oder sowas ähnliches. Da dies ein nicht negativer konstanter Wert ist, kann eine Korrelationsmatrix verwendet werden. In seltenen Fällen kann er jedoch nicht von Choleskey zerlegt werden, da es sich nicht um einen positiven konstanten Wert handelt (dies ist jedoch nicht erforderlich, oder?).

Weiterhin eine solche Matrix

\left( \begin{array}{ccc}
1 & -1 & -1
\\
-1 & 1 & -1
\\
-1 & -1 & 1
\end{array} \right)

Dies sieht auf den ersten Blick auch wie eine Korrelationsmatrix aus, ist jedoch kein nicht negativer konstanter Wert und daher nicht als Korrelationsmatrix qualifiziert. Wenn Sie darüber nachdenken, ist es klar, dass $ Z_1 $ und $ Z_2 $ umgekehrt korreliert sind, $ Z_2 $ und $ Z_3 $ auch umgekehrt korreliert sind und $ Z_3 $ und $ Z_1 $ auch umgekehrt korreliert sind, oder? Was das sagt

\begin{align}
Z_1 = - c_2 Z_2
\\
Z_2 = - c_3 Z_3
\\
Z_3 = -c_1 Z_1
\end{align}

Das heißt ($ c_1, c_2, c_3> 0 $). Das Einsetzen all dessen führt zu $ Z_1 = (negative Konstante) \ mal Z_1 $, was einen Widerspruch verursacht. Diese Art von falschen Daten wird vom mathematischen System abgespielt. Es ist wunderbar.

Das Beispiel, in dem der Fehler früher aufgetreten ist, sah ebenfalls wie eine Korrelationsmatrix aus, ist jedoch kein nicht negativer konstanter Wert, da er negative Eigenwerte enthielt. Mit anderen Worten, es waren die Daten von Chimpung Kampung, die nicht als Korrelationsmatrix bezeichnet werden konnten.

Wenn Sie also eine negative Korrelation hinzufügen, müssen Sie sie etwas milder machen. Zum Beispiel

r_in = np.matrix([
    [1, 0.2, -0.4],
    [0.2, 1, 0.6],
    [-0.4, 0.6, 1]
    ]) # Correlation matrix

Etwas wie das. Wenn Sie den eindeutigen Wert überprüfen ...

Ausgabe


[ 0.17738188  1.18223576  1.64038236]

Alles ist positiv. War gut. Wenn ich es drehe ...

Ausgabe


covariance matrix:
[[ 1.0117086   0.17839112 -0.42687826]
 [ 0.17839112  0.98871838  0.60641387]
 [-0.42687826  0.60641387  1.03022947]]

correlation matrix:
[[ 1.          0.17836482 -0.41812808]
 [ 0.17836482  1.          0.60084968]
 [-0.41812808  0.60084968  1.        ]]

rho12_0p2_rho13_-0p4_rho23_0p6.png

Es gibt eine umgekehrte Korrelation mit einem guten Gefühl! Du hast es geschafft!

Zusammenfassung

Wie können Sie korrelierte $ n $ Zufallszahlen erstellen? Und warum? Ich habe gesehen. In einer solchen Geschichte heißt es immer, "den Choleskey zu zerlegen", aber ich denke, es gibt nicht viele Artikel, in denen sogar erwähnt wird, warum es funktioniert. Die Berechnung selbst ist mit vielen Begriffen etwas umständlich (zu schreiben), aber die Grundlagen der linearen Algebra und Statistik reichen aus, um zum Ende zu gelangen. Wenn Sie mit $ n $ Variablen arbeiten, kommt immer die lineare Algebra auf.

Bei der Überprüfung wurde festgestellt, dass es einige Dinge gibt, die wie eine Korrelationsmatrix aussehen, aber nicht als Korrelationsmatrix bezeichnet werden können. Sie können nicht einfach jede Komponente zwischen $ -1 $ und $ 1 $ haben.

Es macht Spaß, verschiedene Dinge zu entdecken, indem Sie Ihre Hände bewegen. Ich denke, dass die Erzeugung korrelierter Zufallszahlen genau das Richtige ist, also genießen Sie bitte die Statistiken!

[^ 1]: $ X $ ist ein "Spaltenvektor", in dem die Komponenten vertikal angeordnet sind. Da es sich jedoch um Platzverschwendung handelt, wird er als Transposition des Zeilenvektors ausgedrückt. [^ 2]: Weil $ (Korrelation zwischen \ i \ und \ j ) = (Korrelation zwischen \ j \ und \ i ) $. [^ 3]: $ \ {X_i \} $ und $ \ {Z_i \} $ haben dieselbe Varianz, sodass $ a_11 = 1 $ sofort sichtbar ist, aber als Symbol belassen Ich werde es verlassen. [^ 4]: Wenn ich es im interaktiven Modus mache, sieht es aus wie eine Warteschlange, aber es ist nicht so leicht zu sehen, also mache ich es mit einem Skript. [^ 5]: In Wirklichkeit ist die Bedingung für die Choleskey-Zerlegung, dass "die symmetrische Matrix ein positiver Wert ist" ausreichend ist.

Recommended Posts

Generiere n korrelierte Pseudozufallszahlen (mit Python-Beispiel)
Erzeugung von zwei korrelierten Pseudozufallszahlen (mit Python-Beispiel)
Generieren Sie Fibonacci-Zahlen mit Python-Closures, Iteratoren und Generatoren
Mit Python erstellte Beispieldaten
Testen mit Zufallszahlen in Python
[Python] Generiere ein Passwort mit Slackbot
Spielen Sie handschriftliche Zahlen mit Python Teil 2 (identifizieren)
Beispiel für die Wavelet-Konvertierung von Bildern in Python
Zusammenfassung des Bibliotheksvergleichs zum Generieren von PDF mit Python
Versuchen Sie, Python-Dokumente automatisch mit Sphinx zu generieren
Hinweis zum Formatieren von Zahlen mit der Python-Formatierungsfunktion
Beispiel für eine Slack-Benachrichtigung mit Python Lambda
Generieren Sie mit Python eine Einfügeanweisung aus CSV.
Beispielprogramm, das Syslog mit Python-Protokollierung ausgibt
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
Python-Abschlussbeispiel
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
Spezifischer Beispielcode für die Arbeit mit SQLite3 in Python
[Python] Holen Sie sich die Zahlen im Diagramm mit OCR