[PYTHON] La qualification JDLA E mesure les mathématiques appliquées

Passez la 1ère qualification JDAL E en 2020. Un mémorandum que j'ai étudié car il semble que les mathématiques appliquées apparaîtront dans le problème. Nous prévoyons de résumer, ② et ③ ci-dessous.

① Calcul de la matrice inverse ② Décomposition en valeurs singulières ③ Probabilité

① Calcul de la matrice inverse

Cette section décrit le contenu suivant. ・ Calcul de la matrice inverse de la matrice quadratique carrée ・ Calcul de la matrice inverse de la matrice carrée cubique ・ Calcul à l'aide de linalg de numpy

Créer une matrice arbitraire

La matrice utilisée dans cet exemple a été créée avec le code suivant.

matrix.py


import numpy as np
n = 3 #Taille de la matrice
A = np.random.randint(0,9,(n,n)) #Génération de matrice N × n avec des entiers de 0 à 9

Calcul de la matrice inverse de la matrice carrée quadratique

A =
\begin{pmatrix}
a & b \\
c & d
\end{pmatrix}
A^{-1} = \frac{1}{det(A)}
\begin{pmatrix}
d & -b \\
-c & a
\end{pmatrix}
det(A) = ad-bc

◆ Exemple

A =
\begin{pmatrix}
4 & 7 \\
6 & 9
\end{pmatrix}
A^{-1}=
\frac{1}{\rm 4 ・ 9-7,6}\
\begin{pmatrix}
9 & -7 \\
-6 & 4
\end{pmatrix}
=
\begin{pmatrix}
-3/2 & 7/6 \\
1 & -2/3
\end{pmatrix}

◆ Vérifiez avec linalg de numpy linalg est un module algébrique linéaire pour numpy. Veuillez vous référer au lien ci-dessous pour plus de détails. <a href="http://docs.scipy.org/doc/numpy/reference/routines.linalg.html"_blank>Linear algebra (numpy.linalg)

two.py


import numpy as np
A = np.array([[4,7],[6,9]])
#Calcul de matrice inverse
invA = np.linalg.inv(A)
print(invA)
#[[-1.5         1.16666667]
# [1.         -0.66666667]]
print(np.matmul(A,invA))
#[[ 1.00000000e+00 -3.33066907e-16]
# [ 0.00000000e+00  1.00000000e+00]]
#C'est une matrice unitaire proprement

Calcul de matrice inverse de matrice carrée cubique

A =
\begin{pmatrix}
a_{11} & a_{12} & a_{13}\\
a_{21} & a_{22} & a_{23}\\
a_{31} & a_{32} & a_{33}
\end{pmatrix}
A^{-1} = \frac{1}{det(A)}
\begin{pmatrix}
Δ_{11} & Δ_{12} & Δ_{13}\\
Δ_{21} & Δ_{22} & Δ_{23}\\
Δ_{31} & Δ_{32} & Δ_{33}
\end{pmatrix}^{T}
det(A) = a_{11}a_{22}a_{33} + a_{12}a_{23}a_{31} + a_{13}a_{21}a_{32} - a_{13}a_{22}a_{31} -a_{11}a_{23}a_{32}-a_{12}a_{21}a_{33}
Δ_{ij}: L'expression matricielle de la matrice 2 × 2 à l'exclusion de la i-ème ligne et de la j-ème colonne de A(−1)^{i+j}Doublé(Cofacteur)

◆ Image de la formule matricielle Elle est communément appelée la méthode Saras. 三次行列式.jpg

◆ Image du cofacteur 余因子.jpg

◆ Exemple

A =
\begin{pmatrix}
7 & 7 & 5\\
8 & 5 & 6\\
2 & 0 & 7
\end{pmatrix}
det(A)=
7 ・ 5 ・ 7+7 ・ 6 ・ 2+5.8.0-5 ・ 5 ・ 2-7.6.0-7/8/7= -113
Δ_{11} = (-1)^{1+1}
\begin{vmatrix}
5 & 6 \\
0 & 7
\end{vmatrix}
=5,7-6,0=35
Δ_{12} = (-1)^{1+2}
\begin{vmatrix}
8 & 6 \\
2 & 7
\end{vmatrix}
=-8,7+6.2=-44\\
・ ・ ・ Ce qui suit est omis
A^{-1} =
\frac{-1}{113}\
\begin{pmatrix}
35 & -44 & -10\\
-49 & 39 & 14\\
17 & -2 & -21
\end{pmatrix}^{T}
=\frac{1}{113}\
\begin{pmatrix}
-35 & 49 & -17\\
44 & -39 & 2\\
10 & -14 & 21
\end{pmatrix}

◆ Vérifiez avec linalg de numpy

three.py


import numpy as np
A = np.array([[7,7,5],[8,5,6],[2,0,7])
#Calcul de matrice inverse
invA = np.linalg.inv(A)
print(invA)
#[[-0.30973451  0.43362832 -0.15044248]
# [ 0.38938053 -0.34513274  0.01769912]
# [ 0.08849558 -0.12389381  0.18584071]]
#C'est difficile à comprendre car c'est un petit nombre
print(np.matmul(A,invA))
#[[ 1.00000000e+00 -1.80411242e-16  2.77555756e-17]
# [ 1.94289029e-16  1.00000000e+00 -5.55111512e-17]
# [ 4.16333634e-17  1.38777878e-17  1.00000000e+00]]
#C'est une matrice unitaire proprement

Puisqu'il est difficile de dire si la matrice inverse est une fraction et que la réponse est correcte, corrigez-la en une fraction. Tout d'abord, j'ai utilisé Fraction, une fonction intégrée de python, pour en faire une fraction.

three.py a continué


from fractions import Fraction
print(Fraction(invA[0,0]))
# -2789840477132165/9007199254740992

Il n'est pas revenu à la fraction d'origine en raison de l'effet de l'erreur d'arrondi. Même si je l'ai recherché, je ne pouvais pas trouver le code de conversion des fractions en fractions, alors je l'ai fait moi-même pour étudier. Cette fois, je l'ai mis en œuvre assez dur, donc si quelqu'un connaît une meilleure façon, faites-le moi savoir.

Vous trouverez ci-dessous le flux et la source du processus. (1) Créez une table de fractions à l'avance (2) Extraire les éléments du tableau dont la différence avec l'élément de matrice inverse est proche de 0 (3) Reconvertir de l'index de l'élément de table en fraction

three.py a continué


#Préparez une table de fraction
# table_size =À 1000
# [[1/1,2/1,...,1000/1],[1/2,2/2,...,1000/2],...,[1/1000,2/1000,..,1000/1000]]
table_size = 3000
l_frac = np.array([[x/y for x in range(1,table_size+1)] for y in range(1,table_size+1)])
#Définir sous l'erreur lors de la conversion d'une fraction en virgule flottante
e = 1.0e-10
#Ndarray pour stocker la fraction de la réponse, plus tard"1/5"Cast avec str car vous pouvez saisir une fraction avec une chaîne de caractères comme
ans_flac = np.random.rand(len(A)**2).astype("str")

counter = 0

#Comparez la différence avec la table fractionnaire pour chaque élément de la matrice inverse
for i in range(len(A)):
    for j in range(len(A)):
        if invA[i,j] != 0:
            #Obtenez l'index d'une table fractionnaire qui remplit les conditions
            # idx = (Index des lignes qui remplissent les conditions,Index des colonnes qui remplissent les conditions)
            idx = np.where(abs(l_frac-abs(invA[i,j])) < e)
            #Branche conditionnelle avec positif et négatif
            if invA[i,j] < 0:
                #Puisqu'il y a plusieurs correspondances, le premier index(idx[][0])Sélectionnez ans_Magasin à flac
                ans_flac[counter] = str(-(idx[1][0]+1)) + "/" + str(idx[0][0]+1)
                counter += 1
            else:
                ans_flac[counter] = str(idx[1][0]+1) + "/" + str(idx[0][0]+1)
                counter += 1                
        else:
            #Lorsque l'élément de matrice inverse est 0
            ans_flac[counter] = "0"
            counter += 1
#Transformé dans la même forme que la matrice d'origine
ans_flac = ans_flac.reshape([len(A),len(A)])
print(ans_flac)
#[['-35/113' '49/113' '-17/113']
# ['44/113' '-39/113' '2/113']
# ['10/113' '-14/113' '21/113']]

Si une fraction qui s'écarte de table_size arrive, une erreur sera générée, donc si les chiffres de l'élément de matrice deviennent grands, vous devez préparer une table plus grande.

② Décomposition en valeurs singulières

Cette section décrit le contenu suivant. ・ Calcul de la décomposition en valeur singulière ・ Calcul à l'aide de linalg de numpy

L'article suivant a été utile pour le concept et l'utilisation de valeurs singulières. <a href="https://qiita.com/sakami/items/d01fa353b4e1f48623a8"_blank> Explication SVD (décomposition de valeurs singulières)

Comme présenté dans l'article ci-dessus, le livre est détaillé dans l'édition de traitement du langage naturel avec zéro. <a href = "https://www.amazon.co.jp/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E4%BD%9C%E3% 82% 8BApprentissage profond-% E2% 80% 95% E8% 87% AA% E7% 84% B6% E8% A8% 80% E8% AA% 9E% E5% 87% A6% E7% 90% 86% E7 % B7% A8-% E6% 96% 8E% E8% 97% A4-% E5% BA% B7% E6% AF% 85 / dp / 4873118360 "_ blank>" Apprentissage en profondeur à partir de zéro ② Traitement du langage naturel "Yasutake Saito

Je vais laisser les détails au lien et pratiquer la définition et le calcul de la décomposition en valeurs singulières.

Définition: Pour m × n matrice A, m × m matrice orthogonale U satisfaisant la relation suivante,Il existe une matrice orthogonale V n × n et une matrice diagonale m × n S.
A = USV^{T}
U,V est AA respectivement^{T},A^{T}Il s'agit d'une matrice constituée des vecteurs propres de A, et les vecteurs sont appelés vecteur singulier gauche et vecteur singulier droit. La composante diagonale de S est la racine carrée de la valeur propre et est appelée valeur singulière.

◆ Exemple

A = 
\begin{pmatrix}
1 & 1 & 0\\
0 & 0 & 1
\end{pmatrix}

◆ Matrice gauche U Tout d'abord, trouvez le vecteur singulier de gauche et trouvez la matrice U.

AA^{T} = 
\begin{pmatrix}
2 & 0\\
0 & 1
\end{pmatrix}\Si vous définissez la valeur propre comme λ\\
det(AA^{T}-λE) =
 \begin{vmatrix}
2-λ & 0\\
0 & 1-λ
\end{vmatrix} = 0\\
∴λ = 1,2

Lorsque λ = 2, si le vecteur propre est défini comme (ux1, uy1)

 \begin{pmatrix}
2-λ & 0\\
0 & 1-λ
\end{pmatrix} 
 \begin{pmatrix}
u_{x1}\\
u_{y1}
\end{pmatrix} =
 \begin{pmatrix}
0 & 0\\
0 & -1
\end{pmatrix} 
 \begin{pmatrix}
u_{x1}\\
u_{y1}
\end{pmatrix}
= 0\\
\\

\left\{
\begin{array}{ll}
u_{x1}・ 0+ u_{y1}・ 0 = 0 \\
u_{x1}・ 0- u_{y1}· 1= 0
\end{array}
\right.

Quand cela tient toujours,

∴u_{y1} = 0

Par conséquent, le vecteur propre lorsque λ = 2 est le suivant lorsque la longueur du vecteur est normalisée à 1.

 \begin{pmatrix}
u_{x1}\\
u_{y1}
\end{pmatrix}=
\begin{pmatrix}
1\\
0
\end{pmatrix}・ ・ ・(1)

De même, lorsque λ = 1, si le vecteur propre est défini comme (ux2, uy2)

 \begin{pmatrix}
2-λ & 0\\
0 & 1-λ
\end{pmatrix} 
 \begin{pmatrix}
u_{x2}\\
u_{y2}
\end{pmatrix} =
 \begin{pmatrix}
1 & 0\\
0 & 0
\end{pmatrix} 
 \begin{pmatrix}
u_{x2}\\
u_{y2}
\end{pmatrix}
= 0\\
\\

\left\{
\begin{array}{ll}
u_{x2}· 1+ u_{y2}・ 0= 0 \\
u_{x2}・ 0+ u_{y2}・ 0 = 0
\end{array}
\right.\\
∴u_{y1} = 0

Le vecteur propre est ci-dessous.

 \begin{pmatrix}
u_{x2}\\
u_{y2}
\end{pmatrix}=
\begin{pmatrix}
0\\
1
\end{pmatrix}・ ・ ・(2)

U peut être obtenu à partir de (1) et (2).

U = 
 \begin{pmatrix}
u_{x1} & u_{x2}\\
u_{y1} & u_{y2}
\end{pmatrix}=
\begin{pmatrix}
1 & 0\\
0 & 1
\end{pmatrix}

◆ Matrice droite V Ensuite, trouvez le bon vecteur singulier et trouvez la matrice V.

A^{T}A = 
\begin{pmatrix}
1 & 1 & 0\\
1 & 1 & 0\\
0 & 0 & 1
\end{pmatrix}\Si vous définissez la valeur propre comme λ\\
det(AA^{T}-λE) =
 \begin{vmatrix}
1-λ & 1 & 0\\
1 & 1-λ & 0\\
0 & 0 & 1-λ
\end{vmatrix} = 0\\
(1-λ)(λ-2)λ = 0\\
∴λ = 0,1,2

J'ai omis le calcul intermédiaire, mais vous pouvez calculer la formule matricielle par la méthode Saras. Lorsque λ = 2, si le vecteur propre est défini comme (vx1, vy1, vz1)

\begin{pmatrix}
1-λ & 1 & 0\\
1 & 1-λ & 0\\
0 & 0 & 1-λ
\end{pmatrix} 
\begin{pmatrix}
v_{x1}\\
v_{y1}\\
v_{z1}
\end{pmatrix} =
\begin{pmatrix}
-1 & 1 & 0\\
1 & -1 & 0\\
0 & 0 & -1
\end{pmatrix} 
\begin{pmatrix}
v_{x1}\\
v_{y1}\\
v_{z1}
\end{pmatrix}
= 0\\
\\

\left\{
\begin{array}{ll}
-1 ・ v_{x1} + 1 ・ v_{y1} +0 ・ v_{z1}  = 0 \\
1 ・ v_{x1} -1 ・ v_{y1} +0 ・ v_{z1}  = 0 \\
0 ・ v_{x1} +0 ・ v_{y1} -1 ・ v_{z1}  = 0
\end{array}
\right.

Quand cela tient toujours,

∴v_{x1} = v_{y1},v_{z1} = 0

Par conséquent, le vecteur propre est

\begin{pmatrix}
v_{x1}\\
v_{y1}\\
v_{z1}
\end{pmatrix}=
\begin{pmatrix}
1/\sqrt{2}\\
1/\sqrt{2}\\
0
\end{pmatrix}・ ・ ・(3)

Le même calcul peut être effectué lorsque λ = 1,0. Seule la réponse est donnée ici.

λ=Quand 1
\begin{pmatrix}
v_{x2}\\
v_{y2}\\
v_{z2}
\end{pmatrix}=
\begin{pmatrix}
0\\
0\\
1
\end{pmatrix}・ ・ ・(4)\\
λ=Quand 0
\begin{pmatrix}
v_{x3}\\
v_{y3}\\
v_{z3}
\end{pmatrix}=
\begin{pmatrix}
1/\sqrt{2}\\
-1/\sqrt{2}\\
0
\end{pmatrix}・ ・ ・(5)

V peut être obtenu à partir de (3), (4) et (5).

V = 
\begin{pmatrix}
v_{x1} & v_{x2} & v_{x3}\\
v_{y1} & v_{y2} & v_{y3}\\
v_{z1} & v_{z2} & v_{z3}
\end{pmatrix}=
\begin{pmatrix}
1/\sqrt{2} & 0 & 1/\sqrt{2}\\
1/\sqrt{2} & 0 & -1/\sqrt{2}\\
0 & 1 & 0
\end{pmatrix}

◆ Matrice de singularité S Disposez les racines carrées des valeurs propres en diagonale dans l'ordre décroissant.

S = 
\begin{pmatrix}
\sqrt{2} & 0 & 0\\
0 & 1 & 0
\end{pmatrix}

◆ Vérifier Encore une fois, utilisez le module linalg de numpy pour faire correspondre les réponses. Vous pouvez obtenir U, S, V avec une fonction appelée linalg.svd ().

singular_value_decomposition.py



import numpy as np

A = np.array([[1,1,0],[0,0,1]])

#V est calculé pour la translocation
U,S,V_T = np.linalg.svd(A, full_matrices = True)
S = np.diag(S) #La valeur singulière est[λ1,λ2]Diagonale parce qu'elle est unidimensionnelle comme
S = np.insert(S,2,[0,0],axis = 0) #Correspondance de dimension
print("U=\n",U)
print("S=\n",S)
print("V=\n",V.T) #Afficher l'original V par translocation ou translocation
print("A=\n",np.dot(np.dot(U,S),V))
# U=
# [[1. 0.]
# [0. 1.]]
# S=
# [[1.41421356 0.         0.        ]
# [0.         1.         0.        ]]
# V=
# [[ 0.70710678  0.          0.70710678]
# [ 0.70710678  0.         -0.70710678]
# [ 0.          1.          0.        ]]
# A=
# [[1. 1. 0.]
# [0. 0. 1.]]
#Faites correspondre la matrice d'origine

Pour d'autres bases de l'algèbre linéaire, l'article suivant a également été utile. <a href="https://qiita.com/jun40vn/items/15627062d5f1e1dcec2e"_blank> Notions de base sur l'apprentissage automatique 2 Mémo d'algèbre linéaire

③ Probabilité

Cette section décrit le contenu suivant. · Probabilite conditionnelle ・ Théorème de Bayes ・ Distribution Bernoulli ・ Distribution binaire ・ Distribution multi-nooy (catégorielle) ・ Distribution multi-terme

Concernant la distribution de probabilité, le site suivant est très facile à comprendre et je l'ai utilisé comme référence. <a href="http://machine-learning.hatenablog.com/entry/2016/03/26/211106"_blank> Résumé de la distribution discrète compliquée

Probabilite conditionnelle

Prenons le cas où deux personnes, A et B, tirent une loterie avec 3 billets de loterie sur 10. Après avoir tiré la loterie, je vais la remettre.

La probabilité de succès est exprimée en $ P (A) $, la probabilité de perte est exprimée en $ P (\ override {A}) $, et le diagramme et la table de Ben sont résumés comme suit.

弁図.jpg

条件付き確率1.jpg

À ce stade, si la probabilité conditionnelle que A tire une touche et que B tire également une touche est définie comme $ P (B \ mid A) $,

P(B \mid A) =\frac{P(A∩B)}{P(A)}・ ・ ・(6)

Ce sera. C'est une image de la figure ci-dessous.

条件付き確率3.jpg

  • Probabilité simultanée que A et B tiennent en même temps $ P (A∩B) $ est l'image de la figure ci-dessous. 条件付き確率4.jpg

Théorème de Bayes

La relation suivante est également vérifiée par l'équation de probabilité conditionnelle (6).

P(A \mid B) =\frac{P(A∩B)}{P(B)}・ ・ ・(7)

条件付き確率5.jpg

Le théorème de Bayes est la formule qui élimine $ P (A∩B) $ de (6) et (7).

P(B \mid A) =\frac{P(A \mid B) P(B)}{P(A)}・ ・ ・(8)

L'utilisation sera mise à jour séparément.

Distribution de Bernoulli

Considérez un événement avec seulement deux résultats. Un exemple courant est lorsque vous lancez une pièce et que vous essayez de retirer le dos ou une seule fois. En supposant que la probabilité d'apparaître au recto est de $ μ $, les probabilités du recto et du verso sont résumées ci-dessous.

\left\{
\begin{array}{ll}
Probabilité d'apparaître dans le tableau μ= 0.5 \\
Probabilité de sortir du chemin 1-μ  = 0.5 \\
\end{array}
\right.

Si l'événement sur le recto de la pièce est $ X = 1 $ et l'événement sur le verso est $ X = 0 $, la distribution de probabilité du jet de pièce $ Bern (X \ mid μ) $ est

Bern(X \mid μ) = 
μ^{X}(1-μ)^{1-X} \\(X=0,1)

Ce sera. Cela ressemble à ceci dans le graphique.

bern.png

bern.py


#Dessin de la distribution de Bernoulli
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

mu = 0.5
x = np.array([0,1])
y = (mu**x)*(1-mu)**(1-x)
plt.scatter(x,y)

Aussi, la valeur attendue $ E (X) = μ $ et la variance $ σ (X) = μ (1-μ) $.

Distribution binaire

Il s'agit de la distribution de probabilité lorsque le lancer de pièces est répété plusieurs fois. La distribution binomiale $ Bin (m \ mid \ μ, N) $ qui jette des pièces N fois et montre m fois est

Bin(m \mid\ μ,N)=\frac{N!}{m!(N-m)!}μ^{m}(1-μ)^{N-m}

Ce sera.

Aussi, la valeur attendue $ E (X) = Nμ $ et la variance $ σ (X) = Nμ (1-μ) $.

Distribution Martinoe (catégorielle)

Une extension de la distribution Bernoulli. Considérez un événement avec n résultats différents. Un exemple courant est lorsque vous lancez un dé pour tester votre jet. En supposant que la probabilité d'apparition de chaque œil soit $ μ_ {k} $, la distribution multi-nuy $ Cat (X \ mid \ textbf {μ}) $ est la suivante.

Cat(X\mid\textbf{μ})=\prod_{k=1}^{n}\mu_k^{X_{k}}

Distribution multi-terme

Une extension de la distribution Martineuy. Il s'agit de la distribution de probabilité lors de l'exécution de N événements avec n résultats différents. La distribution polynomiale $ Multi (\ textbf {m} \ mid \ textbf {μ}, N) $ est la suivante.

Multi(\textbf{m}\mid\textbf{μ},N)= \frac{N!}{m_{1}!...m_{k}!}\prod_{k=1}^{n}\mu_k^{m_{k}}

distribution normale

La distribution la plus couramment utilisée.

f(x) = \frac{1}{\sqrt{2\pi\sigma}}\exp{\left\{-\frac{(x-\mu)^2}{2\sigma^2}\right\}}

$ \ Mu $ est moyen, $ \ sigma ^ {2} $ est distribué. Mettre $ Z = (x- \ mu) / \ sigma $ donne une distribution normale standard.

f(x) = \frac{1}{\sqrt{2\pi}}\exp{\left\{-\frac{Z^2}{2}\right\}}

prime

Norme

Définition de la norme $ L_ {p} $

{\| {\bf x} \|_p = (\ |x_1|^p + |x_2|^p + \cdots + |x_n|^p )^{1/p}}

Il sort dans le cadre de la régularisation. La norme $ L_ {2} $ est également connue sous le nom de distance euclidienne, et la norme $ L_ {1} $ est également connue sous le nom de distance de Manhattan. Il est donné à la fonction de perte en tant que perte de poids pour éviter le surapprentissage. [Machine learning] Qu'est-ce que la norme LP? [DL] Qu'est-ce que la décroissance du poids?

Recommended Posts

La qualification JDLA E mesure les mathématiques appliquées
[Rabbit Challenge (E qualification)] Mathématiques appliquées
Bulletin de rapport de qualification E