Générer n nombres pseudo-aléatoires corrélés (avec l'exemple Python)

Article précédent génère des nombres pseudo-aléatoires corrélés à 2 $. fait. Cependant, en passant par diverses choses, je voulais $ n $ de nombres aléatoires corrélés, donc je vais vous expliquer comment les générer.

Cette fois, nous allons commencer par créer soudainement des nombres aléatoires $ n $, donc je pense qu'il serait plus facile de lire d'abord l'article précédent.

PS: Si vous voulez juste créer des nombres aléatoires corrélés ou que vous n'êtes pas intéressé par l'arrière-plan, vous pouvez utiliser numpy.random.multivariate_normal.

Aperçu

Lorsqu'il y a des séries de données $ n $, la matrice symétrique avec les coefficients de corrélation $ i $ th et $ j $ th dans le composant $ ij $ est appelée [^ 2], ** matrice de corrélation **. Considérez comment utiliser cette matrice de corrélation comme entrée pour générer des nombres aléatoires $ n $ qui satisfont une corrélation donnée.

Préparez $ n $ nombres aléatoires indépendants avec une moyenne nulle et une variance égale, et combinez-les en un vecteur et exprimez-le comme $ X = (X_1 \ \ X_2 \ \ \ dots \ \ X_n) ^ T $ [^] 1]. À ce stade, $ n $ nombres aléatoires qui ont la même variance que $ X_1 $ et $ X_2 $ et sont corrélés avec la matrice de corrélation $ R $ $ Z = (Z_1 \ \ Z_2 \ \ \ dots \ \ Z_n) ^ T $ est

Z = L \ X \tag{1}

Est requis à.

Cependant, la matrice de corrélation a le coefficient de corrélation de $ Z_i $ et $ Z_j $ comme $ \ 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}

Ainsi, $ L $ est une matrice triangulaire inférieure (une matrice avec tous les zéros en haut à droite de la composante diagonale) obtenue à partir de la décomposition de Choleski de $ R $.

…… Oui, il peut y avoir beaucoup de mots inconnus, mais soyez assuré que je vous expliquerai chacun d'eux. Lol

Donc dans cet article,

Je vais écrire sur.

Je vais aborder ce qu'est la décomposition choleskey, mais je n'expliquerai pas comment réaliser réellement la décomposition.

théorie

En tant que flux général de théorie,

  1. Réfléchissez à comment exprimer $ \ {Z_i \} = Z_1, Z_2, \ dots, Z_n $ en utilisant $ \ {X_i \} $
  2. Associez l'expression obtenue au coefficient de corrélation
  3. Confirmez l'expression

C'est comme ça. Allons-y.

Idées pour faire Z

Pour les nombres aléatoires indépendants $ \ {X_i \} $, la moyenne est zéro et la variance est la même, $ \ sigma ^ 2 $. Comme ils sont indépendants, la covariance $ \ mathrm {Cov} [X_i, X_j] $ et le coefficient de corrélation $ \ mathrm {Corr} [X_i, X_j] $ sont nuls.

Je veux faire $ \ {Z_i \} $ en utilisant ce $ \ {X_i \} $, mais pour le moment, je vais faire comme suit.

\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}

Cela crée d'abord une référence $ Z_1 $, puis $ Z_2 $ avec une corrélation définie avec elle, puis $ Z_1 $ et $ Z_2 $ avec une corrélation définie avec chacun. C'est une image de création de Z_3 $ et de répétition du processus à $ Z_n $. Il est très important de comprendre cette partie. Je pense qu'il n'est pas exagéré de dire que cela occupe plus de la moitié de la partie théorique.

Pour rendre l'image un peu plus facile à saisir, considérez $ n = 3 $. Si vous pensez que l'image est parfaite, ignorez cette partie.

La corrélation est la relation entre deux choses. Cela ne commence pas sans un standard pour penser à une relation,

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

Je ne pense pas que cette partie soit un problème [^ 3]. Ensuite, en utilisant $ Z_1 $ et un autre nombre aléatoire (choisissez $ X_2 $),

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

Ensuite, en choisissant le coefficient approprié, vous pouvez créer $ Z_2 $ qui est en corrélation avec $ Z_1 $ et $ \ rho_ {12} $. Je pense qu'il n'y a pas de problème si vous regardez l'article précédent. Rendre le côté droit de cette expression uniquement $ \ {X_i \} $

\begin{align}
Z_2 &= c_1 \cdot a_{11} X_1 + a_{22} X_2 & (\because Z_Équation 1)
\\
&= a_{21} X_1 + a_{22} X_2 & (\because a_{21} = c_1 \cdot a_{11}J'ai dit) \tag{6}
\end{align}

Vous avez maintenant la formule de la deuxième ligne. Enfin, $ Z_3 $, mais comme il y a déjà deux nombres aléatoires, il existe différents cas possibles comme suit.

Pour couvrir un large éventail de ces situations

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

Et il semble que $ Z_1 $, $ Z_2 $ et un nouveau nombre aléatoire $ X_3 $ devront être superposés. En fait, si $ c_1 $ est pris grand, la situation 1 est prise, si $ c_2 $ est pris grand, la situation 2 est prise, et si $ c_1 = c_2 = 0 $ et seulement $ a_ {31} $ est pris comme un certain nombre, la situation 3 est prise. Je pense que je peux l'exprimer. Le côté droit de cette équation est également représenté uniquement par $ \ {X_i \} $, et l'équation de la troisième colonne peut être dérivée en redéfinissant le coefficient de manière appropriée.

De cette façon, il s'avère que $ Z_ {i + 1} $ peut être créé en superposant les $ Z_1, Z_2, \ dots, Z_i $ déjà créés et le nouveau nombre aléatoire $ X_ {i + 1} $. J'ai fait.

Associer au coefficient de corrélation

Maintenant, si vous exprimez la formule pour trouver $ \ {Z_i \} $ plus tôt sous forme de matrice,

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}

Peut être écrit. C'est exactement la "matrice triangulaire inférieure" qui est sortie juste un coup d'œil, et c'est une matrice qui contient des composantes diagonales et des valeurs dans le coin inférieur gauche, et le coin supérieur droit est tout rempli de zéros.

Cette matrice correspond à $ L $ qui apparaît dans $ Z = L \ X $. Une fois que vous savez cela, il ne vous reste plus qu'à décider du coefficient $ \ {a_ {ij} \} $ pour satisfaire la corrélation donnée. En d'autres termes, tout ce que vous devez savoir est la relation entre $ \ {a_ {ij} \} $ et $ \ {\ rho_ {ij} \} $.

Corrélation entre $ Z_i $ et $ Z_j $ Étant donné $ \ rho_ {ij} $, l'expression à satisfaire est

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

n'est-ce pas. Je suis désolé.

Je ne peux rien dire à ce rythme, donc je vais transformer le côté gauche.

LHS = \frac{\mathrm{Cov}[Z_i, Z_j]}{\sqrt{\mathrm{Var}[Z_i]} \sqrt{\mathrm{Var}[Z_j]}} \ (\because \mathrm{Corr}Définition de)
\tag{10}

Maintenant, anticipons le résultat et autorisons $ \ mathrm {Var} [Z_k] = \ sigma ^ 2 \ (\ mathrm {for \ all} \ k) $. Nous supposons que la distribution de $ \ {Z_k \} $ sera la même que la distribution de $ \ {X_k \} $ (sinon le calcul serait déroutant). Nous vérifierons cela numériquement plus tard.

Donc, la formule ci-dessus est

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

Ce sera. Ensuite, développez la molécule avec $ \ {X_i \} $. Comme $ 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}

Mais pour $ \ 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}

En raison de cette propriété (les lettres minuscules sont des constantes et les lettres majuscules sont des nombres aléatoires), la formule ci-dessus peut être décomposée de la même manière. De plus, dans ce cas $ \ 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}

Ce sera. $ a_ {j (j + 1)} = a_ {j (j + 2)} = \ dots = a_ {ji} = 0 $, donc le terme doit être coupé au $ j $ th.

Enfin, le coefficient de corrélation est

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

Et ça ressemble à ça.

Puisque le calcul a été fait en supposant $ i \ geq j $, la partie triangulaire inférieure de la matrice de corrélation a été calculée, mais comme la matrice de corrélation est toujours symétrique,

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

Tient également. Les indices sur le côté gauche sont secrètement remplacés.

"Résoudre" la matrice

Pour résumer la discussion jusqu'à présent sous la forme d'une matrice, la matrice de corrélation $ R $ utilise $ \ {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}

Cela peut être exprimé ainsi. Il existe deux manières d'exprimer $ R $, l'une avec $ \ {\ rho_ {ij} \} $ et l'autre avec $ \ {a_ {ij} \} $. Cela signifie qu'il était associé à. Après cela, vous pouvez résoudre ce problème pour $ \ {a_ {ij} \} $.

Pour confirmation, calculons avec $ n = 2 $. La correspondance entre la matrice de corrélation et le coefficient

\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}

est. Puisqu'il s'agit d'une matrice de corrélation, $ \ rho_ {11} = \ rho_ {22} = 1 $, et $ \ rho_ {21} = \ rho_ {12} $.

Sur cette base, si nous extrayons une formule significative,

\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}

Et ces trois. Disons $ a_ {kk}> 0 \ (\ mathrm {pour \ tous} \ k) $. Si vous résolvez cela,

\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}

Il est cohérent avec le résultat obtenu la dernière fois. Cela semble bon.

Alors qu'en est-il plus généralement des matrices dimensionnelles $ n $? Regardons à nouveau la procession de plus près. J'ai essayé d'augmenter les ingrédients pour écrire un peu plus.

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}

Il a une jolie forme, n'est-ce pas? En fait ceci,

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}

Ne serait-il pas surprenant de dire qu'il peut être décomposé en forme? En fait, c'est vrai, et c'est là que les mathématiques sont belles.

Vérifions-le comme $ n = 3 $. Le calcul manuel est difficile, je vais donc utiliser SymPy ici. SymPy est une bibliothèque Python qui calcule des formules mathématiques comme Mathematica.

Essayons de multiplier la matrice décomposée et voyons si elle revient à l'original.

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))

Cliquez ici pour la sortie. Il est formé de manière à être facilement visible [^ 4].

production


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]
])

Quoi! Vous obtenez les résultats auxquels vous vous attendez!

Pour le dire autrement, l'opération de "décomposition d'une certaine matrice en produit de la matrice triangulaire inférieure et de sa translocation (matrice triangulaire supérieure)" est la décomposition choleskey. Faisons cela aussi.

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))

production.

production


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

Uo, c'est chouette! Vous pouvez obtenir le coefficient proprement en démontant le choleskey!

Vous pouvez maintenant voir que la décomposition choleskey du coefficient de corrélation $ R $ est la matrice qui générera les nombres aléatoires corrélés!

Résumé de la théorie

Cela s'allonge, je vais donc le résumer ici.

Comment créer des nombres aléatoires $ n $ corrélés:

  1. Préparez la matrice de corrélation $ R $.
  2. Décomposez $ R $ par choleskey pour trouver la matrice triangulaire inférieure $ L $.
  3. Multipliez $ L $ par le vecteur de colonne de nombre aléatoire non corrélé $ X $ à partir de la gauche et vous avez terminé!

Le contour n'a pas du tout changé, mais vous devriez en avoir une bonne idée.

Encore une fois, je ne parlerai pas ici de la façon de calculer la décomposition choleskey. Traitez-le simplement comme une boîte noire qui décompose la matrice en matrices triangulaires. Si vous recherchez la méthode de calcul, vous trouverez diverses choses, veuillez donc l'utiliser.

Vérification

Cela faisait longtemps, mais c'est finalement vérifié avec Python3. Sur la base de la réflexion précédente, nous utiliserons des nombres aléatoires normaux depuis le début.

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()

Ceci est la sortie.

production


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.        ]]

La composante diagonale de la matrice de covariance est la variance. Puisque la valeur est proche de la variance de $ 1 , qui est la même que le nombre aléatoire normal d'origine, la variance de " \ {Z_i \} $ est égale à $ \ {X_i \} $" dans la théorie. L'hypothèse ne semble pas être un problème.

De plus, dans la matrice de corrélation, des nombres proches des valeurs correctement saisies apparaissent.

Cliquez ici pour un graphique de $ Z_2 $ et $ Z_3 $ contre $ Z_1 $. rho12_0p2_rho13_0p8_rho23_0p6.png Il est bien reflété que nous mettons une forte corrélation dans $ \ rho_ {13} $!

Alors qu'en est-il d'une telle matrice de corrélation? Vous voulez également voir la corrélation négative.

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

Quand tu cours ...

production


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

Oups, j'ai eu une erreur (et j'ai découvert que j'utilisais pyenv et anaconda). Apparemment, le démontage de Koleskey a échoué. Vous êtes en colère contre "Matrix n'est pas défini positivement".

Oui, en effet, pour que la décomposition choleskey soit possible, la matrice cible est:

J'ai besoin de ça.

Qu'est-ce qu'une matrice de valeurs positives? Pour tout vecteur non nul $ \ boldsymbol {z} $

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

C'est une matrice symétrique $ M $ telle que [^ 5].

Il existe un bon moyen pour ceux qui ne peuvent pas vérifier chacun d'entre eux. "La matrice $ M $ est une valeur positive" et "Les valeurs uniques de la matrice $ M $ sont toutes positives" ont la même valeur. Vérifions donc le signe de la valeur propre.

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)

production


[-0.10192577  1.19135241  1.91057336]

Oh, après tout, il y a une valeur propre négative. Cela ne peut pas être démonté.

Eh bien, quand il y a une corrélation négative, ne pouvez-vous pas décomposer le choleskey? Non ce n'est pas.

En fait, toute matrice de corrélation a à l'origine une qualitativité non négative (qualitativité semi-positive). La qualitativité non négative est lorsque zéro est inclus dans la condition de qualité positive. En d'autres termes, la valeur propre est zéro ou positive. Un exemple qui inclut une valeur propre de zéro

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

Ou quelque chose comme ça. Puisqu'il s'agit d'une valeur constante non négative, elle est éligible pour une matrice de corrélation, mais il est rare qu'elle ne puisse pas être décomposée par choleskey car ce n'est pas une valeur constante positive (mais ce n'est pas nécessaire, non ??).

De plus, une telle matrice

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

Cela ressemble également à une matrice de corrélation à première vue, mais ce n'est pas une valeur constante non négative, donc elle n'est pas qualifiée de matrice de corrélation. Si vous y réfléchissez, il est clair que $ Z_1 $ et $ Z_2 $ sont inversement corrélés, $ Z_2 $ et $ Z_3 $ sont également inversement corrélés, et $ Z_3 $ et $ Z_1 $ sont également inversement corrélés, non? Ce que ça veut dire

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

Soit ($ c_1, c_2, c_3> 0 $). Remplacer tout cela donne $ Z_1 = (constante négative) \ fois Z_1 $, ce qui provoque une contradiction. Ce type de données incorrectes est joué par le système mathématique. C'est incroyable.

L'exemple dans lequel l'erreur s'est produite plus tôt ressemblait également à une matrice de corrélation, mais ce n'est pas une valeur constante non négative car elle contenait des valeurs propres négatives. En d'autres termes, ce sont les données de Chimpung Kampung qui ne peuvent pas être qualifiées de matrice de corrélation.

Donc, lorsque vous ajoutez une corrélation négative, vous devez la rendre un peu plus douce. Par exemple

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

Quelque chose comme ça. Si vous cochez la valeur unique ...

production


[ 0.17738188  1.18223576  1.64038236]

Tout est positif. C'était bien. Quand je le tourne ...

production


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

Il y a une corrélation inverse avec une bonne sensation! Tu l'as fait!

Résumé

Comment créer des nombres aléatoires corrélés $ n $? Et pourquoi? J'ai vu. Dans une telle histoire, il est toujours dit de "démonter le choleskey", mais je pense qu'il n'y a pas beaucoup d'articles qui mentionnent même pourquoi cela fonctionne. Le calcul lui-même est un peu lourd (à écrire) avec de nombreux termes, mais les bases de l'algèbre linéaire et des statistiques sont suffisantes pour arriver au bout. Après tout, lorsque vous commencez à travailler avec des variables $ n $, l'algèbre linéaire apparaît toujours.

Lors de la vérification, il a été constaté que certains éléments ressemblent à une matrice de corrélation mais ne peuvent pas être appelés une matrice de corrélation. Vous ne pouvez pas simplement avoir chaque composant entre -1 $ et 1 $.

C'est amusant de découvrir diverses choses en bougeant les mains. Je pense que la génération de nombres aléatoires corrélés est juste la bonne chose à faire, alors veuillez profiter des statistiques!

[^ 1]: $ X $ est un "vecteur colonne" dans lequel les composants sont disposés verticalement, mais comme c'est un gaspillage d'espace, il est exprimé comme une transposition du vecteur ligne. [^ 2]: Parce que $ (corrélation entre \ i \ et \ j ) = (corrélation entre \ j \ et \ i ) $. [^ 3]: $ \ {X_i \} $ et $ \ {Z_i \} $ ont la même distribution, donc $ a_11 = 1 $ est immédiatement apparent, mais laissez-le comme symbole ici Je vais le laisser. [^ 4]: Quand je le fais en mode interactif, cela ressemble à une file d'attente, mais ce n'est pas si facile à voir, donc je le fais avec un script. [^ 5]: Donc, en réalité, la condition pour la décomposition choleskey est que "la matrice symétrique est une valeur positive" est suffisante.

Recommended Posts

Générer n nombres pseudo-aléatoires corrélés (avec l'exemple Python)
Génération de deux nombres pseudo-aléatoires corrélés (avec exemple Python)
Générez des nombres de Fibonacci avec des fermetures, des itérateurs et des générateurs Python
Exemple de données créées avec python
Tester avec des nombres aléatoires en Python
[Python] Générer un mot de passe avec Slackbot
Jouez des nombres manuscrits avec python, partie 2 (identifier)
Exemple de conversion en ondelettes d'images en Python
Résumé de la comparaison des bibliothèques pour générer des PDF avec Python
Essayez de générer automatiquement des documents Python avec Sphinx
Remarque pour le formatage des nombres avec la fonction de format python
Exemple de notification Slack avec python lambda
Générez une instruction d'insertion à partir de CSV avec Python.
Exemple de programme qui génère un syslog avec la journalisation Python
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Twilio avec Python
Exemple de fermeture Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Zundokokiyoshi avec python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Exemple de code spécifique pour travailler avec SQLite3 en Python
[Python] Obtenez les nombres dans l'image graphique avec OCR