ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ:
# ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΠ°ΡΡΠΈΡΠ°ΠΌΠΈ
import numpy as np
# ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ
import scipy.linalg as sla
# ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠΌΠΈ ΠΌΠ°ΡΡΠΈΡΠ°ΠΌΠΈ
import scipy.sparse as sps
# ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ Π΄Π»Ρ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΡ
ΠΌΠ°ΡΡΠΈΡ
import scipy.sparse.linalg as spla
#Π¨ΠΈΡΠΎΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ
ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΡΡΠ½ΠΊΡΠΈΠΉ
from scipy import special
# ΠΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°
import matplotlib.pyplot as plt
# ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ
import timeit
# ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΡΠΈΡΠΎΠ²ΡΠ²Π°ΡΡ Π³ΡΠ°ΡΠΈΠΊΠΈ ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΡΡΠΌΠΎ Π² Π½ΠΎΡΡΠ±ΡΠΊΠ΅, Π° Π½Π΅ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΎΠΊΠ½Π΅. ΠΠΈΠ·Π½Π΅Π½Π½ΠΎ Π²Π°ΠΆΠ½Π°Ρ Π²Π΅ΡΡ!
%matplotlib inline
Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠΈ ΠΌΠ°ΡΡΠΈΡΠ½ΡΠ΅ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΡΡΡΡ ΡΠΎΡΠ½ΡΠΌΠΈ: ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΎΠΌΠ½ΠΎΠΆΠΈΡΠ΅Π»Π΅ΠΉ Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π½ΡΠ΅ΡΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ $A$. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΡΡΠΎΠΌ ΡΠ°ΡΡΠΎ ΠΌΠ΅ΡΠ°Π΅Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΡ.
ΠΠ»Ρ $LU$ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ l2-Π½ΠΎΡΠΌΠ° ΠΎΡΠΈΠ±ΠΊΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ $||\delta A|| = ||A - LU||$ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΠ΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΎΡΠ΅Π½ΠΊΠ΅:
$$||\delta A|| \leqslant ||L|| \cdot ||U|| \cdot O(\varepsilon_{machine})$$Π Π½ΠΎΡΠΌΡ $L$ ΠΈ $U$ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅Ρ ΠΎΡΠΎΡΠΈΠΌΠΈ.
ΠΠ°Π΄Π°Π½ΠΈΠ΅ 1.1 (1 Π±Π°Π»Π») Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ LU-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
$$\begin{pmatrix} 10^{-20} & 1\\ 1 & 1 \end{pmatrix} = \begin{pmatrix} 1 & 0\\ 10^{20} & 1 \end{pmatrix}\cdot\begin{pmatrix} 10^{-20} & 1\\ 0 & 1 - 10^{20} \end{pmatrix}$$ΠΠ΅ΡΠ΅ΠΌΠ½ΠΎΠΆΡΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ $L$ ΠΈ $U$. Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ½ΠΎΠΆΡΡΠ΅ ΡΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΌΠ°ΡΡΠΈΡΡ, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ΅Ρ Π΅Π΄ΠΈΠ½ΠΈΡ ΠΏΠΎΡΡΠ°Π²ΡΡΠ΅ Π΄Π΅ΡΡΡΠΈΡΠ½ΡΠ΅ ΡΠΎΡΠΊΠΈ. ΠΠ·ΠΌΠ΅Π½ΠΈΠ»ΡΡ Π»ΠΈ ΠΎΡΠ²Π΅Ρ? ΠΠ°ΠΊ Π²Π°ΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ?
L = np.array([[1, 0], [10**20, 1]])
U = np.array([[10**(-20), 1], [0, 1-10**20]])
Lz = np.array([[1., 0], [10**20, 1.]])
Uz = np.array([[10**(-20), 1.], [0, 1.-10**20]])
print(L.dot(U))
print(Lz.dot(Uz))
ΠΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° Π²ΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π΄Π΅Π»Π°ΡΡΡΡ Π² ΠΏΠ»Π°Π²Π°ΡΡΠΈΡ ΡΠΎΡΠΊΠ°Ρ .
Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Π΄Π΅Π»Π°Π΅ΡΡΡ Π² ΡΠ΅Π»ΡΡ ΡΠΈΡΠ»Π°Ρ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² bigint), ΡΠΎ Π΅ΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΡΠΎΡΠ½ΠΎ. ΠΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΡ ΠΆΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ $ \approx 10^{-17} $, ΠΈ ΡΠ°ΠΌ Π½Π΅Π²Π΅ΡΠ΅Π½ Π΄Π°ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠ°ΡΡΠΈΡΡ $U$, Π² Π½ΡΠΌ ΡΠ΅ΡΡΠ΅ΡΡΡ ΡΠ»Π°Π³Π°Π΅ΠΌΠΎΠ΅ $1$.
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡΡ ΠΌΠ°ΡΡΠΈΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΠΎΡΡΠΈ Π½Π°Π²Π΅ΡΠ½ΡΠΊΠ° Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π° Π±ΡΠ΄ΡΡ ΡΠΈΡΠ»Π°ΠΌΠΈ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ (Π° Π½Π΅ ΡΠ΅Π»ΡΠΌΠΈ).
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ, Π΅ΡΠ»ΠΈ Π²ΡΡΠΈΡΠ»ΠΈΡΡ QR-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ½ΠΎΠΆΠΈΡΡ ΠΌΠ°ΡΡΠΈΡΡ $Q$ ΠΈ $R$.
q, r = np.linalg.qr(L.dot(U))
print(q)
print(r)
print(q.dot(r))
ΠΠ°ΠΎΠ±ΠΎΡΠΎΡ, ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΡ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ, ΠΎΠ½ ΠΎΠ±Π½ΡΠ»ΠΈΠ»ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΉ ΡΠΎΡΠ½ΠΎΡΡΠΈ.
ΠΡΡ ΠΎΠ΄: LU-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ Π²ΡΠ±ΠΎΡΠΎΠΌ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° (ΠΏΠΎ ΡΡΠΎΠ»Π±ΡΡ)
ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΈΡΠ΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ Π² ΡΡΠΎΠ»Π±ΡΠ΅ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΡΡΠΎΠΊΡ Π½Π°Π²Π΅ΡΡ .
$$\begin{pmatrix} b_{11} & \dots & b_{1i} & b_{1,i+1} & \dots & b_{1n}\\ & \ddots & \vdots & \vdots & & \vdots\\ & & \color{blue}{b_{ii}} & \color{blue}{b_{i,i+1}} & \dots & \color{blue}{b_{in}} \\ & & b_{i+1,i} & b_{i+1,i+1} & \dots & b_{i+1,n}\\ & & \vdots & \vdots & & \vdots \\ & & \color{green}{b_{ji}} & \color{green}{b_{j,i+1}} & \dots & \color{green}{b_{jn}} \\ & & \vdots & \vdots & & \vdots\\ \end{pmatrix}\longrightarrow \begin{pmatrix} b_{11} & \dots & b_{1i} & b_{1,i+1} & \dots & b_{1n}\\ & \ddots & \vdots & \vdots & & \vdots\\ & & \color{green}{b_{ji}} & \color{green}{b_{j,i+1}} & \dots & \color{green}{b_{jn}} \\ & & b_{i+1,i} & b_{i+1,i+1} & \dots & b_{i+1,n}\\ & & \vdots & \vdots & & \vdots \\ & & \color{blue}{b_{ii}} & \color{blue}{b_{i,i+1}} & \dots & \color{blue}{b_{in}} \\ & & \vdots & \vdots & & \vdots\\ \end{pmatrix}\longrightarrow$$$$\longrightarrow\begin{pmatrix} b_{11} & \dots & b_{1i} & b_{1,i+1} & \dots & b_{1n}\\ & \ddots & \vdots & \vdots & & \vdots\\ & & \color{green}{b_{ji}} & \color{green}{b_{j,i+1}} & \dots & \color{green}{b_{jn}} \\ & & 0 & b'_{i+1,i+1} & \dots & b'_{i+1,n}\\ & & \vdots & \vdots & & \vdots \\ & & 0 & b'_{i,i+1} & \dots & b'_{in} \\ & & \vdots & \vdots & & \vdots \end{pmatrix}$$ΠΠ°Π΄ΠΎ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ Π²Ρ Π²ΡΠ΅ ΠΈ ΡΠ΅ΡΠ°Π»ΠΈ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΊΡΡΡΠ΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠ°! ΠΠΌΠ΅Π½Π½ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΉ, Π° Π½Π΅ ΠΏΠ΅ΡΠ²ΡΠΉ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΡΠΎΠ»Π±ΡΠ° Π±Π΅ΡΡΡΡΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΡΠΈΡΠ»ΠΎ - ΡΠ΅ΠΌ ΠΌΠ΅Π½ΡΡΠΈΠ΅ ΠΏΠΎΠ³ΡΠ΅ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ Π²Π½ΠΎΡΠΈΡ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π½Π΅Π³ΠΎ.
Π§ΡΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ? ΠΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΡΡΠΎΠΊ ΠΌΠ°ΡΡΠΈΡΡ ΡΠ°Π²Π½ΠΎΡΠΈΠ»ΡΠ½Π° ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ Π΅Ρ ΡΠ»Π΅Π²Π° Π½Π° ΠΌΠ°ΡΡΠΈΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ
$$L_nP_nL_{n-1}P_{n-1}\ldots L_2P_2L_1P_1 A = U\qquad\qquad(1)$$Π³Π΄Π΅ $L_1,\ldots,L_n$ - Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΆΠ½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ.
ΠΠΎΠΏΡΠΎΡ: ΠΡ, ΠΈ Π³Π΄Π΅ Π·Π΄Π΅ΡΡ ΠΌΠ°ΡΡΠΈΡΠ° $L$?!
ΠΡΠ²Π΅Ρ: ΠΠ²Π΅Π΄ΡΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ
\begin{align*} L'_n &= L_n\\ L'_{n-1} &= P_nL_nP_{n-1}\\ L'_{n-2} &= P_nP_{n-1}L_{n-1}P_n^{-1}P_{n-1}^{-1}\\ &\ldots\\ L'_1 &= P_nP_{n-1}\ldots P_2L_1P_2^{-1}\ldots P_{n-1}^{-1}P_n^{-1} \end{align*}Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅. ΠΠ°ΡΡΠΈΡΡ $L'_i$ ΡΠΎΠΆΠ΅ Π½ΠΈΠΆΠ½Π΅ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΡΠ΅!
Π’ΠΎΠ³Π΄Π° Π»Π΅Π²Π°Ρ ΡΠ°ΡΡΡ (1) ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ΅ΡΡΡ Π² Π²ΠΈΠ΄Π΅
$$\underbrace{L'_nL'_{n-1}\ldots L'_1}_{:=L^{-1}}\underbrace{P_nP_{n-1}\ldots P_1}_{:=P^{-1}}\cdot A$$ΠΡΠΎΠ³: ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° $$A = PLU$$ Π³Π΄Π΅ $P$ - ΠΌΠ°ΡΡΠΈΡΠ° ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ.
Π€ΡΠ½ΠΊΡΠΈΡ scipy.linalg.lu Π² ΠΠΈΡΠΎΠ½Π΅ Π½Π°Ρ
ΠΎΠ΄ΠΈΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠΎΠ΅ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅!
ΠΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ $L$ Π½Π΅ ΠΏΡΠ΅Π²ΠΎΡΡ ΠΎΠ΄ΡΡ $1$, ΡΠ°ΠΊ ΡΡΠΎ $||L||]\leqslant 1$. ΠΡΠΈ ΡΡΠΎΠΌ $$||\Delta A|| \leqslant ||A||\cdot O(\rho \varepsilon_{machine}),$$ Π³Π΄Π΅ $$\rho = \frac{\max_{i,j}|u_{ij}|}{\max_{i,j}|a_{ij}|}$$
ΠΠΎ ΡΡΠΎ, Π΅ΡΠ»ΠΈ ΡΡΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π²Π΅Π»ΠΈΠΊΠΎ?
ΠΠ°Π΄Π°Π½ΠΈΠ΅ 1.2 (1 Π±Π°Π»Π») Π‘Π³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ $500\times500$, ΠΈΠΌΠ΅ΡΡΡΡ Π²ΠΈΠ΄
$$\begin{pmatrix} 1 & 0 & 0 & \cdots & 0 & 0 & 1\\ -1 & 1 & 0 & & & 0 & 1\\ -1 & -1 & 1 & 0 & & 0 & 1\\ \vdots & & \ddots & \ddots & \ddots & \vdots & \vdots \\ -1 & -1 & -1 & \ddots & 1 & 0 & 1\\ -1 & -1 & -1 & & -1 & 1 & 1\\ -1 & -1 & -1 & \cdots & -1 & -1 & 1 \end{pmatrix}$$ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ½Π°ΡΠ°Π»Π° Π½ΡΠ»Π΅Π²ΡΡ ΠΌΠ°ΡΡΠΈΡΡ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, Π° ΠΏΠΎΡΠΎΠΌ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ Π΅Ρ ΠΊΠ»Π΅ΡΠΊΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ.
ΠΠ°ΠΉΠ΄ΠΈΡΠ΅ Π΅Ρ PLU-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ QR-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ $P = E$. ΠΡΡΠΈΡΠ»ΠΈΡΠ΅ $||A - LU||_2$ ΠΈ $||A - QR||_2$. Π§Π΅ΠΌΡ ΡΠ°Π²Π΅Π½ ΡΠ°ΠΊΡΠΎΡ ΡΠΎΡΡΠ° ΠΌΠ°ΡΡΠΈΡΡ $A$?
Π ΡΡΠ°ΡΡΡΡ, Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ ΡΠ°ΠΊ ΡΠ΅Π΄ΠΊΠΎ Π±ΡΠ²Π°Π΅Ρ (ΡΡΡΡ Π΅Π³ΠΎ Π·Π½Π°Π΅Ρ ΠΏΠΎΡΠ΅ΠΌΡ). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, QR-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΡ-ΡΠ°ΠΊΠΈ Π»ΡΡΡΠ΅. Π’Π΅ΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠ΅Π½ΠΊΠ° Π΄Π»Ρ ΠΎΡΠΈΠ±ΠΊΠΈ QR-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅Π΅Ρ Π²ΠΈΠ΄
$$||A - QR||_2 \leqslant ||A||_2\cdot O(\varepsilon_{machine})$$ΠΠ°Π΄Π°Π½ΠΈΠ΅ 1.3 (1 Π±Π°Π»Π») Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ°ΡΠΊΠ°Π»Ρ $S_n = \left(C_{i + j}^i\right)$ ($i,j = 0,\ldots,n-1$).
ΠΠ°ΠΊΠΎΠ²ΠΎ Π΅Ρ LU-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅? ΠΡΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠΎΡΠΌΡΠ»Ρ Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΡ L ΠΈ U ΠΈ ΠΏΡΠΈΠ²Π΅Π΄ΠΈΡΠ΅ ΠΊΡΠ°ΡΠΊΠΎΠ΅ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΡΠΌΠΎ Π² Π½ΠΎΡΡΠ±ΡΠΊΠ΅. ΠΠ΅ ΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ scipy.linalg.lu, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ "ΡΠ³Π°Π΄Π°ΡΡ": ΠΌΠ°ΡΡΠΈΡΠ° P Π±ΡΠ΄Π΅Ρ ΠΎΡΠ»ΠΈΡΠ½Π° ΠΎΡ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΠΉ, ΠΈ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π½Π΅ ΡΠΎ, ΡΡΠΎ Ρ
ΠΎΡΠ΅Π»ΠΈ.
ΠΠ°ΠΊΠΎΠ² Π΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ?
ΠΠ°Ρ ΠΎΡΠ²Π΅Ρ
ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ my_pascal(n), Π³Π΅Π½Π΅ΡΠΈΡΡΡΡΡΡ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ°ΡΠΊΠ°Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠ° $n\times n$.
ΠΠ°ΠΉΠ΄ΠΈΡΠ΅ Π½ΠΎΡΠΌΡ ΡΠ°Π·Π½ΠΎΡΡΠΈ $||A - PLU||_2$. ΠΠ΅ ΡΠ°ΠΊΠ°Ρ ΡΠΆ ΠΈ Π±ΠΎΠ»ΡΡΠ°Ρ, ΠΏΡΠ°Π²Π΄Π°?
###
# Your function here
###
A = my_pascal(30)
# Find ||A - PLU||_2 here
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΏΡΠΎΡΠΈΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅Π»Ρ ΠΌΠ°ΡΡΠΈΡΡ ΠΠ°ΡΠΊΠ°Π»Ρ $30\times30$ ΠΈ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΡΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ:
print(sla.det(A))
# Try to solve a linear system
x = np.ones(30)
b = A.dot(x)
x1 = sla.solve(A, b)
print(sla.norm(x1 - x))
Π’Π°ΠΊ ΡΠ΅Π±Π΅ ΠΎΡΠΈΠ±ΠΊΠ°. Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ QR-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ. Π‘ΡΠ°Π½Π΅Ρ Π»ΠΈ Π»ΡΡΡΠ΅?
Q, R = sla.qr(A)
x2 = sla.solve_triangular(R, Q.T.dot(b))
print(sla.norm(x2 - x))
ΠΠ±ΡΡΡΠ½ΠΈΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π½Π΅ΠΏΡΠΈΡΡΠ½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ.
ΠΠ°Ρ ΠΎΡΠ²Π΅Ρ
ΠΠ°Π΄Π°Π½ΠΈΠ΅ 2.1. ΠΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ? (3 Π±Π°Π»Π»Π°)
Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΡΠ΅ΡΠ΅Π½ΠΈΡ Π‘ΠΠΠ£ $Ax = b$, Π³Π΄Π΅ $A = A^T$, $A \geqslant 0$ Ρ ΠΌΠ°ΡΡΠΈΡΠ½ΠΎΠΉ ΠΏΡΠ°Π²ΠΎΠΉ ΡΠ°ΡΡΡΡ $b$.
ΠΠ°ΠΈΠ²Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ±: $x = A^{-1}b$;
Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ±: Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ solve ΠΌΠΎΠ΄ΡΠ»Ρ scipy.linalg;
Π Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π₯ΠΎΠ»Π΅ΡΠΊΠΎΠ³ΠΎ: Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π₯ΠΎΠ»Π΅ΡΠΊΠΎΠ³ΠΎ Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΡΡ $A$ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π²ΡΡ Π‘ΠΠΠ£ Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΡΠΌΠΈ ΠΌΠ°ΡΡΠΈΡΠ°ΠΌΠΈ;
Π Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π₯ΠΎΠ»Π΅ΡΠΊΠΎΠ³ΠΎ Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΠΌΠΈ scipy: Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π₯ΠΎΠ»Π΅ΡΠΊΠΎΠ³ΠΎ Π΄Π»Ρ ΠΌΠ°ΡΡΠΈΡΡ $A$ ΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ
ΠΏΡΠΎΡΠ΅Π΄ΡΡ ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.linalg (cho_factor, cho_solve).
ΠΠ»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π‘ΠΠΠ£ Ρ ΡΡΠ΅ΡΠ³ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΠ΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ solve_triangular ΠΈΠ· ΠΏΠ°ΠΊΠ΅ΡΠ° scipy.linalg.
def naive_solve(A, b):
# Your code here
# And so on and so forth
ΠΡΠΎΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² Π½Π° Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ Π‘ΠΠΠ£ Π½Π° ΠΏΡΠ΅Π΄ΠΌΠ΅Ρ ΡΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠΎΠ²
ΠΡΠΎΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ ΠΈ Π²ΡΡΡΠ½ΠΈΡΠ΅, ΠΊΠ°ΠΊ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²
Ρ ΡΠΎΡΡΠΎΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΌΠ°ΡΡΠΈΡΡ $A$ ΠΏΡΠΈ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΏΡΠ°Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ. Π Π°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Ρ 10, 100, 1000 ΠΏΡΠ°Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ;
Ρ ΡΠΎΡΡΠΎΠΌ ΡΠΈΡΠ»Π° ΠΏΡΠ°Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ ΠΏΡΠΈ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ $A$ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, $100\times100$).
ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΡΠΈΡΡΠΉΡΠ΅ Π³ΡΠ°ΡΠΈΠΊΠΈ (Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ ΠΎΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°). ΠΠ°ΠΊΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π±ΡΡΡΡΡΠΌ?
ΠΠ»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Π°ΠΌ ΠΏΡΠΈΠ³ΠΎΠ΄ΡΡΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ, ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ numpy.random.randn. ΠΠΎ Π½Π΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅, ΡΡΠΎ Π² Π·Π°Π΄Π°ΡΠ΅ ΡΠ΅ΡΡ ΠΈΠ΄ΡΡ ΠΎ ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΡ
ΠΌΠ°ΡΡΠΈΡΠ°Ρ
. Π’Π°ΠΊ ΡΡΠΎ ΠΏΠΎΠ΄ΡΠΌΠ°ΠΉΡΠ΅, ΠΊΠ°ΠΊ ΠΈΠ· ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ
ΠΌΠ°ΡΡΠΈΡ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠ΅.
ΠΠ°ΡΡΠΈΡΡ Π»Π΅Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ $100\times100$: ΠΏΡΠΈ ΠΌΠ΅Π½ΡΡΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ½ΠΎΡΡΡΡ Π·Π°ΠΌΠ΅ΡΠ½ΡΡ ΡΠΎΠ»Ρ ΠΌΠΎΠ³ΡΡ ΠΈΠ³ΡΠ°ΡΡ ΡΠ°ΠΊΡΠΎΡΡ, Π½Π΅ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ Π°Π»Π³Π΅Π±ΡΠ΅. ΠΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Ρ ΠΌΠ°ΡΡΠΈΡΠ°ΠΌΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΎΡ 100 Π΄ΠΎ 1000 ΠΈ Ρ ΡΠΈΡΠ»ΠΎΠΌ ΠΏΡΠ°Π²ΡΡ ΡΠ°ΡΡΠ΅ΠΉ ΠΎΡ 10 Π΄ΠΎ 10000. ΠΡΠΈΠ³ΠΎΡΠΎΠ²ΡΡΠ΅ΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ Π·Π°Π½ΡΡΡ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π²ΡΠ΅ΠΌΡ.
ΠΠ°Π΄Π°Π½ΠΈΠ΅ 2.2. ΠΡΠΈΠΌΠ΅Ρ: Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π»ΠΎΠ³Π°ΡΠΈΡΠΌΠ° ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅ΡΠ½ΠΎΠ³ΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ (3 Π±Π°Π»Π»Π°)
Π‘Π»ΡΡΠ°ΠΉΠ½Π°Ρ Π²Π΅Π»ΠΈΡΠΈΠ½Π° $\vec{x}\in\mathbb{R}^D$ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅ΡΠ½ΠΎΠ΅ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, Π΅ΡΠ»ΠΈ Π΅Ρ ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° ΠΊΠ°ΠΊ $$ p(\vec{x}) = \mathcal{N}(\vec{x}|\vec{\mu},\Sigma) = \frac{1}{\sqrt{2\pi}^D\sqrt{\det\Sigma}}\exp\left(-\frac{1}{2}(\vec{x}-\vec{\mu})^T\Sigma^{-1}(\vec{x}-\vec{\mu})\right) $$ ΠΠ΄Π΅ΡΡ $\vec{\mu}\in\mathbb{R}^D -$ Π²Π΅ΠΊΡΠΎΡ ΠΌΠ°Ρ. ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ $\vec{x}$, Π° $\Sigma\in\mathbb{R}^{D{\times}D} -$ ΠΌΠ°ΡΡΠΈΡΠ° ΠΊΠΎΠ²Π°ΡΠΈΠ°ΡΠΈΠΈ.
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ°ΡΡΠΈΡΠ½ΡΡ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π»ΠΎΠ³Π°ΡΠΈΡΠΌΠ° Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΠΈ Π΄Π»Ρ Π½Π°Π±ΠΎΡΠ° Π²Π΅ΠΊΡΠΎΡΠΎΠ² $X = \{\vec{x}_1,\dots,\vec{x}_N\}$ Π΄Π»Ρ Π·Π°Π΄Π°Π½Π½ΡΡ $\vec{\mu}$ ΠΈ $\Sigma$.
#ΠΠ°Π³ΠΎΡΠΎΠ²ΠΊΠ°:
def my_multivariate_normal_logpdf(X, m, S):
'''
ΠΠ²ΠΎΠ΄
-----
X: Π½Π°Π±ΠΎΡ ΡΠΎΡΠ΅ΠΊ, numpy array ΡΠ°Π·ΠΌΠ΅ΡΠ° N x D;
m: Π²Π΅ΠΊΡΠΎΡ ΡΡΠ΅Π΄Π½ΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, numpy array Π΄Π»ΠΈΠ½Ρ D;
S: ΠΊΠΎΠ²Π°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΠΌΠ°ΡΡΠΈΡΡ, numpy array ΡΠ°Π·ΠΌΠ΅ΡΠ° D x D.
ΠΡΠ²ΠΎΠ΄
------
res: ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, numpy array Π΄Π»ΠΈΠ½Ρ N.
'''
Π‘Π³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ Π²ΡΠ±ΠΎΡΠΊΡ ΠΈΠ· Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ Π΄Π»Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ $D$ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ scipy.stats.multivariate_normal.rvs ΠΈ ΡΡΠ°Π²Π½ΠΈΡΠ΅ Π½Π° ΡΡΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠ°Π±ΠΎΡΡ Π²Π°ΡΠ΅Π³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ scipy.stats.multivariate_normal.logpdf
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅ Π²ΡΠ΅ΠΌΡ ΡΠ°Π±ΠΎΡΡ Π²Π°ΡΠ΅Π³ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ° ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ scipy.stats.multivariate_normal.logpdf Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ $D$. ΠΠΎΡΡΠ°ΡΠ°ΠΉΡΠ΅ΡΡ Π΄ΠΎΠ±ΠΈΡΡΡΡ, ΡΡΠΎΠ±Ρ Π²Π°Ρ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π²ΡΠΈΠ³ΡΡΠ²Π°Π» ΠΏΠΎ ΡΠΊΠΎΡΠΎΡΡΠΈ Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ.
Π Π·Π°Π΄Π°ΡΠ΅ Π±ΡΠ΄ΡΡ ΠΎΡΠ΅Π½ΠΈΠ²Π°ΡΡΡΡ:
ΠΠ°ΡΡΠΈΡΠ° Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΠΎΠΉ, Π΅ΡΠ»ΠΈ Π² Π½Π΅ΠΉ ΠΌΠ°Π»ΠΎ Π½Π΅Π½ΡΠ»Π΅Π²ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π² ΠΌΠ°ΡΡΠΈΡΠ΅ $n\times n$ ΠΏΠΎΡΡΠ΄ΠΊΠ° $O(n)$ Π½Π΅Π½ΡΠ»Π΅Π²ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΎΠ½Π° ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΠΎΠΉ.
ΠΠ°ΡΠ°ΡΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ½ΠΎΡΡΡ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΡ ΠΌΠ°ΡΡΠΈΡ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠΈΡ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ Π·Π°Π΄Π°ΡΠ°Ρ , ΡΠ°ΠΊ Π²Π΅Π»ΠΈΠΊΠ°, ΡΡΠΎ Ρ ΡΠ°Π½ΠΈΡΡ Π΅Ρ Π² ΠΏΠ°ΠΌΡΡΠΈ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π½ΡΠ»ΡΠΌΠΈ - Π½Π΅ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΠ΅Π»ΡΠ½Π°Ρ ΡΠΎΡΠΊΠΎΡΡ. ΠΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Ρ ΡΠ°Π½Π΅Π½ΠΈΡ:
Dictionary of Keys (DOK) - ΡΠ»ΠΎΠ²Π°ΡΡ (i,j):element.
$\color{green}{\oplus}$ Π±ΡΡΡΡΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌΠΈ ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΠΌΠΈ,
$\color{red}{\ominus}$ Π»ΡΠ±ΡΠ΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π±ΡΠ΄ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.
List of Lists (LIL) - ΠΌΠ°ΡΡΠΈΡΠ° Ρ
ΡΠ°Π½ΠΈΡΡΡ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ: Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΡΡ
ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² [l_1,...,l_s] ΠΈ [v_1,...v_s], Π³Π΄Π΅ l_i - ΡΠΏΠΈΡΠΎΠΊ Π½ΠΎΠΌΠ΅ΡΠΎΠ² ΡΡΠΎΠ»Π±ΡΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ
Π² i-ΠΉ ΡΡΡΠΎΠΊΠ΅ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, Π° v_i - ΡΠΏΠΈΡΠΎΠΊ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ. Π ΡΠ΅Π»ΠΎΠΌ, ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π² Π²ΡΡΠΎΠΊΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ. ΠΠΎΠ³Π΄Π° Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ, Π»ΡΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ Π² ΡΠΎΡΠΌΠ°Ρ CSR ΠΈΠ»ΠΈ CSC.
$\color{green}{\oplus}$ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ,
$\color{green}{\oplus}$ Π±ΡΡΡΡΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΡΠΎΠΊΠ°ΠΌ ΠΌΠ°ΡΡΠΈΡΡ,
$\color{red}{\ominus}$ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ΅Π±ΠΎΠ²Π°ΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΌΡΡΠΈ (Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΡ ΠΏΠΎΠ²ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ COO).
Coordinate List (COO) - Ρ
ΡΠ°Π½ΡΡΡΡ ΡΡΠΎΠΉΠΊΠΈ (row, column, value) ΠΈΠ»ΠΈ ΡΡΠΈ ΠΌΠ°ΡΡΠΈΠ²Π° \texttt{rows,\ columns,\ values}. ΠΡΠΈ ΡΡΠΎΠΌ ΡΡΠΎΠΉΠΊΠ° Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ Π½Π°ΡΠ°Π»ΠΎΠΌ (row, column) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ ΠΎΠ΄Π½Π°; ΠΏΡΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΡΠΈΠΏΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ value ΡΡΠΌΠΌΠΈΡΡΡΡΡΡ.
$\color{green}{\oplus}$ Π±ΡΡΡΡΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²,
$\color{red}{\ominus}$ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π»ΡΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π²Π΅ΡΡΠΈ Π² Π΄ΡΡΠ³ΠΎΠΉ ΡΠΎΡΠΌΠ°Ρ.
Compressed Sparse Row/Column storage (CSR/CSC) - ΡΠ°Π·Π±Π΅ΡΡΠΌ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ CSR. Π₯ΡΠ°Π½ΡΡΡΡ ΡΡΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°: values, indptr ΠΈ indices. Π ΠΌΠ°ΡΡΠΈΠ²Π΅ values Ρ
ΡΠ°Π½ΡΡΡΡ Π²ΡΠ΅ Π½Π΅Π½ΡΠ»Π΅Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ, ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΠ΅ Π»Π΅ΠΊΡΠΈΠΊΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎ ΠΏΠ°ΡΠ΅ (ΡΡΡΠΎΠΊΠ°, ΡΡΠΎΠ»Π±Π΅Ρ); indptr[i] - ΠΈΠ½Π΄Π΅ΠΊΡ Π½Π°ΡΠ°Π»Π° i-ΠΉ ΡΡΡΠΎΠΊΠΈ, indices[indptr[i]:indptr[i+1]-1] - Π½ΠΎΠΌΠ΅ΡΠ° ΡΡΠΎΠ»Π±ΡΠΎΠ² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
$\color{green}{\oplus}$ Π±ΡΡΡΡΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ,
$\color{green}{\oplus}$ Π±ΡΡΡΡΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΡΠΎΠΊΠ°ΠΌ Π΄Π»Ρ CSR ΠΈ ΠΊ ΡΡΠΎΠ»Π±ΡΠ°ΠΌ Π΄Π»Ρ CSC,
$\color{red}{\ominus}$ ΠΎΡΠ΅Π½Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠΎΠ»Π±ΡΠ°ΠΌ Π΄Π»Ρ CSR ΠΈ ΠΊ ΡΡΡΠΎΠΊΠ°ΠΌ Π΄Π»Ρ CSC,
$\color{red}{\ominus}$ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅/ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
ΠΠ»Π°Π²Π½ΡΠΉ Π²ΡΠ²ΠΎΠ΄ - Π½Π΅ Π½Π°Π΄ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠΎΡΠΌΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΡΠ΅Π»Π΅ΠΉ!
ΠΠΎΡ Π·Π΄Π΅ΡΡ http://docs.scipy.org/doc/scipy/reference/sparse.html ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΠ°ΠΊ ΡΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ scipy.
ΠΠΎΡ Π·Π΄Π΅ΡΡ https://www.cise.ufl.edu/research/sparse/matrices/index.html Π²ΡΠ»ΠΎΠΆΠ΅Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΡ ΠΌΠ°ΡΡΠΈΡ ΠΈΠ· ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π§ΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΡΠΈΡΡΠ½ΠΎ, ΡΠ°ΠΉΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π»Ρ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΏΡΠ΅Π΄ΠΏΡΠΎΡΠΌΠΎΡΡ ΠΈ Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΡΠΎΠΌ, ΡΠ²Π»ΡΡΡΡΡ Π»ΠΈ ΠΌΠ°ΡΡΠΈΡΡ ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΠΌΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΌΠΈ.
ΠΠ°Π΄Π°Π½ΠΈΠ΅ 3.0 ΠΠ°Π³ΡΡΠ·ΠΈΡΠ΅ ΡΠ°ΠΉΠ» sparse_matrix1.mtx
import scipy.io as sio
A = sio.mmread(r'...\sparse_matrix1.mtx') # Please type right folder name!
Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ, ΠΊΠ°ΠΊ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ Π½Π΅Π½ΡΠ»Π΅Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ:
plt.spy(A, marker='.', markersize=0.4)
Π ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠ· ΠΏΡΡΠΈ ΡΠΎΡΠΌΠ°ΡΠΎΠ² Ρ
ΡΠ°Π½ΠΈΡΡΡ ΠΌΠ°ΡΡΠΈΡΠ°? ΠΠ»Ρ ΠΎΡΠ²Π΅ΡΠ° Π½Π° ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ΡΡ ΡΡΠ½ΠΊΡΠΈΡ type.
Π‘ΠΊΠΎΠ»ΡΠΊΠΎ Π² Π½Π΅ΠΉ Π½Π΅Π½ΡΠ»Π΅Π²ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ²?
ΠΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΎΡΠΌΠ°ΡΠ°ΠΌΠΈ.
import pandas as pd
import timeit
A_dok = A.todok()
A_lil = A.tolil()
A_csc = A.tocsc()
A_csr = A.tocsr()
conversion_times = pd.DataFrame(
index=['COO', 'DOK', 'LIL', 'CSR', 'CSC'],
columns=['COO', 'DOK', 'LIL', 'CSR', 'CSC'],
data={
'COO': [
np.nan,
timeit.timeit('A.todok()', 'from __main__ import A', number=100) / 100,
timeit.timeit('A.tolil()', 'from __main__ import A', number=100) / 100,
timeit.timeit('A.tocsr()', 'from __main__ import A', number=100) / 100,
timeit.timeit('A.tocsc()', 'from __main__ import A', number=100) / 100,
],
'DOK': [
timeit.timeit('A_dok.tocoo()', 'from __main__ import A_dok', number=100) / 100,
np.nan,
timeit.timeit('A_dok.tolil()', 'from __main__ import A_dok', number=100) / 100,
timeit.timeit('A_dok.tocsr()', 'from __main__ import A_dok', number=100) / 100,
timeit.timeit('A_dok.tocsc()', 'from __main__ import A_dok', number=100) / 100,
],
'LIL': [
timeit.timeit('A_lil.tocoo()', 'from __main__ import A_lil', number=100) / 100,
timeit.timeit('A_lil.todok()', 'from __main__ import A_lil', number=100) / 100,
np.nan,
timeit.timeit('A_lil.tocsr()', 'from __main__ import A_lil', number=100) / 100,
timeit.timeit('A_lil.tocsc()', 'from __main__ import A_lil', number=100) / 100,
],
'CSR': [
timeit.timeit('A_csr.tocoo()', 'from __main__ import A_csr', number=100) / 100,
timeit.timeit('A_csr.todok()', 'from __main__ import A_csr', number=100) / 100,
timeit.timeit('A_csr.tolil()', 'from __main__ import A_csr', number=100) / 100,
np.nan,
timeit.timeit('A_csr.tocsc()', 'from __main__ import A_csr', number=100) / 100,
],
'CSC': [
timeit.timeit('A_csc.tocoo()', 'from __main__ import A_csc', number=100) / 100,
timeit.timeit('A_csc.todok()', 'from __main__ import A_csc', number=100) / 100,
timeit.timeit('A_csc.tolil()', 'from __main__ import A_csc', number=100) / 100,
timeit.timeit('A_csc.tocsr()', 'from __main__ import A_csc', number=100) / 100,
np.nan,
],
}
)
conversion_times.T
ΠΠ°ΠΊ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, Π±ΡΡΡΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΎΡΠΌΠ°ΡΠ°ΠΌΠΈ COO, CSR ΠΈ CSC, Π° Ρ
ΡΠΆΠ΅ Π²ΡΠ΅Π³ΠΎ Π΄Π΅Π»Π° ΠΎΠ±ΡΡΠΎΡΡ Ρ ΡΠΎΡΠΌΠ°ΡΠΎΠΌ DOK: Π²ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ· Π½Π΅Π³ΠΎ Π·Π°Π½ΠΈΠΌΠ°ΡΡ ΡΡΠ΄ΠΎΠ²ΠΈΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ.
ΠΠ°Π΄Π°Π½ΠΈΠ΅ 3.1 (1 Π±Π°Π»Π») ΠΠΎΡΠ΅ΠΌΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· ΡΠΎΡΠΌΠ°ΡΠ° LIL ΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ DOK Π² ΡΠΎΡΠΌΠ°Ρ CSR Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΡΠ°ΠΊΡΡ ΠΏΡΠΎΠΏΠ°ΡΡΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ?
ΠΠ°Ρ ΠΎΡΠ²Π΅Ρ:
ΠΠ°Π΄Π°Π½ΠΈΠ΅ 3.2 (1 Π±Π°Π»Π») Π’ΠΎΡΠ³ΠΎΠ²Π°Ρ ΡΠ΅ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠ»Π° Π²Π°ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΠΏΠΎΠΊΡΠΏΠΊΠ°Ρ ΡΠ²ΠΎΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΡΠΎΠ±ΠΎΡ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΠΎΡΠ΅Π½ ΡΡΡΡΡ ΡΠ΅ΠΊΠΎΠ² (ΡΠΏΠΈΡΠΊΠΎΠ² ΠΏΠΎΠΊΡΠΏΠΎΠΊ). ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΎΠ²Π°ΡΡ ΡΠ°ΡΠ΅ ΠΏΠΎΠΊΡΠΏΠ°ΡΡ Π²ΠΌΠ΅ΡΡΠ΅, Π²Ρ ΡΠ΅ΡΠΈΠ»ΠΈ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΠΌΠ°ΡΡΠΈΡΡ, ΡΡΡΠΎΠΊΠΈ ΠΈ ΡΡΠΎΠ»Π±ΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΡΠΎΠ²Π°ΡΠ°ΠΌ (ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ ΡΠΈΡΠ»ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΠ²Π°ΡΠΎΠ² ΡΠΎΠΆΠ΅ ΠΈΠ·ΠΌΠ΅ΡΡΠ΅ΡΡΡ ΡΠΎΡΠ½ΡΠΌΠΈ ΡΡΡΡΡ), Π° Π² ΠΊΠ»Π΅ΡΠΊΠ΅ Ρ "Π½ΠΎΠΌΠ΅ΡΠΎΠΌ" $(g_1, g_2)$ ΡΡΠΎΠΈΡ ΡΠΈΡΠ»ΠΎ
$\log_2{\frac{N\cdot c(g_1 \& g_2)}{c(g_1)c(g_2)}},$
Π³Π΄Π΅ $c(g_i)$ --- ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΊΠΎΠ², ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ ΡΠΎΠ²Π°Ρ $g_i$, $c(g_1 \& g_2)$ --- ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΠΊΠΎΠ², ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΡ ΠΎΠ±Π° ΡΠΎΠ²Π°ΡΠ°, $N$ --- ΠΎΠ±ΡΠ΅Π΅ ΡΠΈΡΠ»ΠΎ ΡΠ΅ΠΊΠΎΠ². Π ΠΊΠ°ΠΊΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅ Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΡΡ (ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΡ) ΠΌΠ°ΡΡΠΈΡΡ? ΠΠΎΡΠ΅ΠΌΡ?
ΠΠ°Ρ ΠΎΡΠ²Π΅Ρ:
ΠΠ°ΠΏΠΈΡΠΈΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΊΠΎΠ΄, ΡΠΎΠ·Π΄Π°ΡΡΠΈΠΉ ΡΡΡ ΠΌΠ°ΡΡΠΈΡΡ:
def CreateMatrix(receipts):
# Your code here
for receipt in receipts:
# Your code here
ΠΠ°Π΄Π°Π½ΠΈΠ΅ 3.3 (1 Π±Π°Π»Π») Π ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠ· ΡΠΎΡΠΌΠ°ΡΠΎΠ² LIL ΠΈ COO ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΠΊΡΠΎΡ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π±ΡΡΡΡΠ΅Π΅? ΠΠΎΡΠ΅ΠΌΡ? ΠΡΠΎΠ²Π΅Π΄ΠΈΡΠ΅ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ. ΠΠΎΠΆΠ΅ΡΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ scipy.sparse.random Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ
ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΡ
ΠΌΠ°ΡΡΠΈΡ.
ΠΠ°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΡΡΡΡΠ΅Π΅ Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ Π±ΡΠ΄ΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΡΠΎΡΠΌΠ°ΡΡ CSC ΠΈ CSR?
#Your experiments
ΠΠ°Ρ ΠΎΡΠ²Π΅Ρ:
Π ΡΡΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ Π²Π°ΠΌ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΠΏΠΎΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ.
Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ scipy.sparse.linalg (http://docs.scipy.org/doc/scipy-0.14.0/reference/sparse.linalg.html). ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΡΠΈΡΠ°ΠΉΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΠ΅ΡΠ΅Π΄ ΠΈΡ
ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ!
Π ΡΡΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ Π²Π°ΠΌ ΠΏΡΠ΅Π΄ΡΡΠΎΠΈΡ ΠΏΠΎΠ±Π»ΠΈΠΆΠ΅ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡΡΡΡ Ρ Π΄Π²ΡΠΌΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ:
(L)GMRES (ΠΌΡ Π½Π°ΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΠ½ΠΊΡΠΈΡ scipy.sparse.linalg.lgmres, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΎΠ±ΡΠΊΠ½ΠΎΠ²Π΅Π½Π½ΡΠΉ GMRES)
CG (Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ scipy.sparse.linalg.cg)
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΡ:
scipy.sparse.linalg.lgmres ΠΈ scipy.sparse.linalg.cs ΡΡΡΡΠΎΠ΅Π½Ρ ΡΠ°ΠΊ, ΡΡΠΎ ΠΌΠΎΠ³ΡΡ ΡΠ΅ΡΠ°ΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π²Π΅ΠΊΡΠΎΡΠ½ΠΎΠΉ ΠΏΡΠ°Π²ΠΎΠΉ ΡΠ°ΡΡΡΡ.scipy.sparse.linalg.lgmres ΠΈΡ
ΠΎΡΠ΅Π½Ρ ΠΌΠ½ΠΎΠ³ΠΎ) ΠΈ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎΡΠΌΠ°Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΡΠ½ΠΊΡΠΈΠΉ.callback: ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ Ρ ΡΠΈΠ³Π½Π°ΡΡΡΠΎΠΉ callback(xk), Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΠ°Ρ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ xk - ΡΡΠΎ ΡΠ΅ΠΊΡΡΠ΅Π΅ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅ $x_k$. ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ lgmres, ΠΏΠ΅ΡΠ°ΡΠ°ΡΡΠ΅ΠΉ Π½ΠΎΡΠΌΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΡ:x = spla.gmres(A, b, callback=lambda xk: print(sla.norm(xk))
ΠΡΠ»ΠΈ Π²Ρ Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠΎΡ
ΡΠ°Π½ΡΡΡ ΠΏΠΎ Ρ
ΠΎΠ΄Ρ Π΄Π΅Π»Π°, Π»ΠΎΠ³ΠΈΡΠ½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡ. ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠ»Π°ΡΡΠ°, ΡΡΠΈΡΠ°ΡΡΠ΅Π³ΠΎ ΡΠΈΡΠ»ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΠΈ Π²ΡΠ²ΠΎΠ΄ΡΡΠ΅Π³ΠΎ (Π΅ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½ ΡΠ»Π°Π³ disp) Π½ΠΎΠΌΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° ΠΏΠ΅ΡΠ°ΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡΠ΅Π³ΠΎ Π²ΡΠ΅ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠ΅ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΡ (Π½Π΅ Π΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠ°ΠΊ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ
ΡΠΈΡΡΠ΅ΠΌ! Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Ρ
Π²Π°ΡΠΈΡΡ ΠΏΠ°ΠΌΡΡΠΈ):
class iterative_counter(object):
def __init__(self, disp=True):
self._disp = disp
self.niter = 0
self.all_x = [] # Please discard this if you solve large systems!!!
def __call__(self, xk=None):
self.niter += 1
self.all_x.append(xk) # Please discard this if you solve large systems!!!
if self._disp:
print('iter %3i' % (self.niter))
my_counter = gmres_counter() # We need to create an instance of the class
x = spla.gmres(A, b, callback=my_counter)
print(my_counter.niter) # Will print total number of iterations
ΠΠ°Π΄Π°Π½ΠΈΠ΅ (4 Π±Π°Π»Π»Π°) ΠΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΈΠ³Ρ! ΠΠΎΡΠ° ΡΠ΅ΡΠ°ΡΡ Π±ΠΎΠ»ΡΡΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠ°Π³ΡΡΠ·ΠΈΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π° large_system.mtx (ΠΎΠ½Π° ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½Π°Ρ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½Π°Ρ) ΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠΉΡΠ΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΠΏΡΠ°Π²ΡΡ ΡΠ°ΡΡΡ. Π Π΅ΡΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ scipy.sparse.linalg.spsolve (ΡΠΈΠ»ΡΠ½ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ "ΡΠΎΡΠ½ΡΠΉ" ΡΠ΅ΡΠ°ΡΠ΅Π»Ρ) ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² LGMRES ΠΈ CG. Π‘ΡΠ°Π²Π½ΠΈΡΠ΅ ΡΠΊΠΎΡΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ ΡΡΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ².
ΠΠΎΡΡΠ°ΡΠ°ΠΉΡΠ΅ΡΡ ΠΎΠ±ΠΎΠ³Π½Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ spsolve, ΠΏΡΠΈΠΌΠ΅Π½ΡΡ ΠΏΡΠ΅Π΄ΠΎΠ±ΡΡΠ»Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠ΅ΡΠΎΠ΄Π° Π―ΠΊΠΎΠ±ΠΈ ΠΈΠ»ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ LU-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ»Ρ ILU ΠΏΠΎΡΡΠ°ΡΠ°ΠΉΡΠ΅ΡΡ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°ΡΡ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² fill_factor ΠΈ drop_tol.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. ΠΡΠ»ΠΈ ΠΌΠ°ΡΡΠΈΡΠ°-ΠΏΡΠ΅Π΄ΠΎΠ±ΡΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΠ΅Π»Ρ $P$ Π½Π΅ ΡΠΎΠ²ΡΠ΅ΠΌ ΡΠΆ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½Π°Ρ, Π½Π΅ Π½Π°Π΄ΠΎ Π΅Ρ ΠΎΠ±ΡΠ°ΡΠ°ΡΡ ΠΈ ΡΠΌΠ½ΠΎΠΆΠ°ΡΡ Π½Π° ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ!
Π ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΏΡΠ΅Π΄ΠΎΠ±ΡΡΠ»Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° M. Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π»ΠΈΠ±ΠΎ ΠΌΠ°ΡΡΠΈΡΡ $P^{-1}$, Π»ΠΈΠ±ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ, ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΠΈΠΉ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π΅ΠΊΡΠΎΡΠ° Π½Π° $P^{-1}$. ΠΠΎ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Π²ΡΠΎΡΠΎΠ΅ Π³ΠΎΡΠ°Π·Π΄ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½Π΅Π΅. ΠΠ΅Π»Π°Π΅ΡΡΡ ΡΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ Π²Π²Π΅ΡΡΠΈ ΠΏΡΠ΅Π΄ΠΎΠ±ΡΡΠ»Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΠ΅ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΠ΅ΠΉ $P$ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ $Ax = b$:
M = spla.LinearOperator(A.shape, lambda x: spla.spsolve(P, x))
x = spla.lgmres(A, b, M=M)
Π Π²ΠΎΡ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ LU-ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΡ:
my_ILU = spla.spilu(A, '''Add your parameters here''')
M = spla.LinearOperator(A.shape, lambda x: my_ILU.solve(x))
x = spla.lgmres(A, b, M=M)
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ my_ILU --- ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΡΡΠΎ tuple ΠΈΠ· ΡΠ΅ΡΡΡΡΡ
ΠΌΠ°ΡΡΠΈΡ (spilu Π΄Π΅Π»Π°Π΅Ρ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄Π° $P_1AP_2 = LU$, Π³Π΄Π΅ $P_i$ --- ΠΌΠ°ΡΡΠΈΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΠΎΠ²ΠΎΠΊ). Π ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΊΠ°ΠΊ Π²Ρ ΡΠΆΠ΅, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, ΠΏΠΎΠ½ΡΠ»ΠΈ, Π² ΠΌΠΈΡΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ
ΡΠ°Π·ΠΌΠ΅ΡΠ½ΠΎΡΡΠ΅ΠΉ ΠΈΠΌΠ΅ΡΡ ΠΌΠ°ΡΡΠΈΡΡ --- ΡΡΠΎ Π·Π°ΡΠ°ΡΡΡΡ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΠ΅ Π·Π°Π½ΡΡΠΈΠ΅. ΠΠΎΡΠ°Π·Π΄ΠΎ ΡΠ΅Π½Π½Π΅Π΅ ΡΠΌΠ΅ΡΡ Π±ΡΡΡΡΠΎ ΡΠ΅ΡΠ°ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Ρ ΡΡΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΠ΅ΠΉ. ΠΠΎΡΡΠΎΠΌΡ my_ILU --- ΡΡΠΎ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π½Π΅ ΡΠ°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (Π²ΠΏΡΠΎΡΠ΅ΠΌ, ΠΌΠ°ΡΡΠΈΡΡ ΠΏΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΡΡ), Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ΅ΡΠ°ΡΠ΅Π»Ρ solve.
# Your solution here
ΠΠ°Π΄Π°ΡΠ° 5.1 (1 Π±Π°Π»Π») ΠΡΡΡΡ $f$ --- ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ ΠΌΠ°ΡΡΠΈΡ $n\times n$, Π° $g$ --- ΡΡΠ½ΠΊΡΠΈΡ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅ ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΡ ΠΌΠ°ΡΡΠΈΡ $n\times n$, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡΠ°Ρ Ρ $f$ Π½Π° ΡΠ²ΠΎΠ΅ΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ. ΠΠΎΠΊΠ°ΠΆΠΈΡΠ΅, ΡΡΠΎ
$$\frac{\partial g}{\partial X} = \frac{\partial f}{\partial X} + \left(\frac{\partial f}{\partial X}\right)^T - \mathrm{diag}\left(\frac{\partial f}{\partial x_{11}}, \frac{\partial f}{\partial x_{22}},\ldots, \frac{\partial f}{\partial x_{nn}}\right)$$ΠΠ°Π΄Π°ΡΠ° 5.2 (1 Π±Π°Π»Π») ΠΠ°ΠΉΠ΄ΠΈΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ
$$\frac{\partial\mathrm{tr}\left(AX^2BX^{-T}\right)}{\partial X}$$ΠΠ°Π΄Π°ΡΠ° 5.3 (1 Π±Π°Π»Π») ΠΠ°ΠΉΠ΄ΠΈΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΡΡ
$$\frac{\partial\ln{\det\left(X^TAX\right)}}{\partial X}$$ΠΠ°Π΄Π°ΡΠ° 5.4 (2 Π±Π°Π»Π»Π°) ΠΠΎΠΏΡΡΡΠΈΠΌ, ΡΡΠΎ Π²Π΅ΠΊΡΠΎΡΡ $y_1,\ldots,y_m$ Π²ΡΠ±ΡΠ°Π½Ρ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅ΡΠ½ΠΎΠ³ΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Ρ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌΠΈ Π²Π΅ΠΊΡΠΎΡΠΎΠΌ ΡΡΠ΅Π΄Π½ΠΈΡ $m$ ΠΈ ΠΊΠΎΠ²Π°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΠ΅ΠΉ $\Sigma$. Π ΡΡΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π½Π°ΠΉΡΠΈ ΠΎΡΠ΅Π½ΠΊΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ $\hat{m}$ ΠΈ $\hat{\Sigma}$.
ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ Π²ΠΊΡΠ°ΡΡΠ΅, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΎΡΠ΅Π½ΠΊΠ° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ. ΠΡΡΡΡ $p(x|\theta_1,\ldots,\theta_k)$ --- ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠ»ΠΎΡΠ½ΠΎΡΡΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Ρ Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΠΌΠΈ Π½Π°ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ $\theta_1,\ldots,\theta_k$, Π° $y_1,\ldots,y_m$ --- Π²ΡΠ±ΠΎΡΠΊΠ° ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ. \textit{Π€ΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ} Π½Π°Π·ΠΎΠ²ΡΠΌ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ $L(y_1\ldots,y_m|\theta_1,\ldots,\theta_k) := \prod_{j=1}^kp(y_j|\theta_1,\ldots,\theta_k)$; Π³ΡΡΠ±ΠΎ Π³ΠΎΠ²ΠΎΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠΉ Π²ΡΠ±ΠΎΡΠΊΠΈ $y_1,\ldots,y_m$ ΠΏΡΠΈ Π΄Π°Π½Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΠ΅Π½ΠΊΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ Π΄ΠΎΡΡΠΈΠ³Π°Π΅Ρ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌΠ°. ΠΡΠΈ ΡΡΠΎΠΌ ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΄ΠΎΠ±Π½Π΅Π΅ ΠΌΠ°ΠΊΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π½Π΅ ΡΠ°ΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ, Π° Π»ΠΎΠ³Π°ΡΠΈΡΠΌΠΈΡΠ΅ΡΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ $l(y_1\ldots,y_m|\theta_1,\ldots,\theta_k) = \ln{L(y_1\ldots,y_m|\theta_1,\ldots,\theta_k)}$.
ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°. ΠΠΎΡΡΠ°ΡΠ°ΠΉΡΠ΅ΡΡ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ $\sum_i(x_i - m)^T\Sigma^{-1}(x_i - m)$ Π² ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡ ΠΌΠ°ΡΡΠΈΡΡ $X$, ΡΡΠΎΠ»Π±ΡΠ°ΠΌΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ²Π»ΡΡΡΡΡ Π²Π΅ΠΊΡΠΎΡΡ $x_i$.
Π₯ΠΎΡΠΎΡΠ΅Π΅ Π·Π½Π°Π½ΠΈΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ Π² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΌ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠΈ. Π ΡΡΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΠ°ΠΌ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠ² Π·Π½Π°Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΡΠ½ΠΎΠ³ΠΎ Π΄ΠΈΡΡΠ΅ΡΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ :)
Π ΠΎΠ±Π»Π°ΡΡΠΈ ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π±ΠΈΠ½Π°ΡΠ½ΠΎΠΉ ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ (ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ², $+1$ ΠΈΠ»ΠΈ $-1$ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°) ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΎΠ³ΠΈΡΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΡ. ΠΠ½Π° Π²ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠ°Π²Π΄ΠΎΠΏΠΎΠ΄ΠΎΠ±ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π·Π°Π΄Π°ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ:
$$ L(w, X, y) = \sum_{i = 0}^{N} log (1 + exp(-y_ix_i^Tw)) + \frac{C}{2} ||w||^2 \longrightarrow \min_w$$$$X \in R^{N \times M}, x \in R^{M}, w \in R^{M}, y \in \{-1, 1\}^N$$ΠΠ΄Π΅ΡΡ $X$ - ΠΌΠ°ΡΡΠΈΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΡ-ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ Π΄Π»Ρ ΠΎΠ±ΡΡΠ°ΡΡΠ΅ΠΉ Π²ΡΠ±ΠΎΡΠΊΠΈ (ΠΏΠΎ ΡΡΡΠΎΠΊΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΏΠΎ ΡΡΠΎΠ»Π±ΡΠ°ΠΌ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ), Π° $y$ - Π²Π΅ΠΊΡΠΎΡ ΠΎΡΠ²Π΅ΡΠΎΠ². ΠΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ $C$, Π²ΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π±ΠΈΡΠ°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°Π·Π½ΡΠ΅ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ ΡΠ°Π·Π½ΡΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌ Π·Π°Π΄Π°ΡΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ. ΠΠΎ ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠΆΠ΅ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΊ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΠ΅, ΡΠΎ Π² ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ ΠΌΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ $\mathbf{C = 1}$
ΠΠΎΠ³Π΄Π° ΠΌΡ ΡΠ΅ΡΠΈΠ»ΠΈ Π·Π°Π΄Π°ΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ (Π½Π°ΡΠ»ΠΈ $w$), ΠΌΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠΎ ΠΏΡΠ°Π²ΠΈΠ»Ρ $y(x) = sign(x^Tw)$. Π Π΄Π°Π½Π½ΠΎΠΉ ΡΠ°ΡΡΠΈ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ.
ΠΠ»Π°Π½ Ρ Π½Π°Ρ ΡΠ°ΠΊΠΎΠΉ:
ΠΠ»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°
w, X, y = np.random.random(10), np.random.random((11, 10)), 2*(np.random.randint(0, 2, 11)-0.5)
ΠΠ°Π΄Π°ΡΠ° 6.0 (1 Π±Π°Π»Π»)
ΠΠ°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΉΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ L, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΡΡΠΈΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ (Π²Π½ΡΡΡΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠΈΠΊΠ»ΠΎΠ²).
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΠΈΠ³Π΄Π΅ Π² ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ
Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡΡ
Π½Π΅ ΡΡΠΎΠΈΡ Π²ΡΡΠΈΡΠ»ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ $exp(βy_ix^Tw)$, ΠΈΠ½Π°ΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΡΠΈ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π½Π°ΠΏΡΡΠΌΡΡ Π²ΡΡΠΈΡΠ»ΡΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ: np.logaddexp Π΄Π»Ρ ln(1 + exp(Β·)) ΠΈ sp.special.expit Π΄Π»Ρ 1/(1 + exp(-(Β·))).
def logistic(w, X, y):
'''
logistic(w, X, y) Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° Π»ΠΎΠ³ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠΈ L(w, X, y)
w: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,)
X: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (N, M)
y: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,)
funcw: np.float
'''
funcw = # ΠΡΡΠΈΡΠ»ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ L
return funcw
logistic(w, X, y)
ΠΠ°Π΄Π°ΡΠ° 6.1 (2 Π±Π°Π»Π»Π°)
ΠΠ°ΠΉΠ΄ΠΈΡΠ΅ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ $\nabla_w L(w, X, y)$, Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
<Π Π΅ΡΠ΅Π½ΠΈΠ΅>
ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π·Π°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΉΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ° (ΠΎΠΏΡΡΡ ΠΆΠ΅, ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΡΡΠΈΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ!)
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ Π΄Π»Ρ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΡ ΠΌΠ°ΡΡΠΈΡ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π½Π°ΠΏΠΈΡΠ°ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠΎΠ΄.
def logistic_grad(w, X, y):
'''
logistic_grad(w, X, y) Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° Π»ΠΎΠ³ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠΈ dL(w, X, y)/dw
w: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,)
X: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (N, M)
y: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,)
gradw: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,)
'''
if sps.issparse(X):
gradw = # ΠΡΡΠΈΡΠ»ΠΈΡΠ΅ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ dL/dw
else:
gradw = # ΠΡΡΠΈΡΠ»ΠΈΡΠ΅ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ dL/dw
return gradw
assert(logistic_grad(w, X, y).shape == w.shape)
ΠΡΠ΅Π½Ρ ΡΠ°ΡΡΠΎ ΠΏΡΠΈ ΠΏΠΎΠ΄ΡΡΡΡΠ΅ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ° Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄ΡΡΡΡΠ° Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΡΠ°Π·Π½ΠΎΡΡΠ΅ΠΉ.
$$[\nabla f(x)]_i \approx \frac{f(x + \epsilon \cdot e_i) - f(x)}{\epsilon}~~~~$$Π³Π΄Π΅ $e_i = (0, ... , 0, 1, 0, ..., 0)$ - i-ΠΉ Π±Π°Π·ΠΈΡΠ½ΡΠΉ ΠΎΡΡ, $\epsilon \approx 10^{-8}$
ΠΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΡΡ Π±Ρ Ρ ΠΎΠ±ΡΠΊΠ½ΠΎΠ²Π΅Π½Π½ΡΠΌΠΈ (Π½Π΅ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠΌΠΈ ΠΌΠ°ΡΡΠΈΡΠ°ΠΌΠΈ)
def max_error(a, b):
return np.max(np.abs(a-b))
def grad_finite_diff(func, w, eps=1e-8):
'''
w: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,)
func: ΡΠΊΠ°Π»ΡΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡ Π²Π΅ΠΊΡΠΎΡΠ½ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° w, func(w) = ΡΠΈΡΠ»ΠΎ
eps: np.float ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ°
dnum: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,), ΡΠΈΡΠ»Π΅Π½Π½ΠΎ ΠΏΠΎΡΡΠΈΡΠ°Π½Π½ΡΠΉ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ
'''
w, fval, dnum = w.astype(np.float64), func(w), np.zeros_like(w)
for i in range(w.size):
ei = # ΠΠ΅ΠΊΡΠΎΡ Π½ΡΠ»Π΅ΠΉ (0, ..., 0, 1, 0, ..., 0) c 1 Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ i
dnum[i] = # ΠΡΡΠΈΡΠ»ΠΈΡΠ΅ ΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ d func/dw_i Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ
ΡΠ°Π·Π½ΠΎΡΡΠ΅ΠΉ
return dnum
mat_grad = logistic_grad(w, X, y)
num_grad = grad_finite_diff(lambda w: logistic(w, X, y), w)
err = max_error(mat_grad, num_grad)
print('err = ', err, 'ok' if err < 1e-6 else 'ΠΎΡΠΈΠ±ΠΊΠ° ΠΎΡΠ΅Π½Ρ Π±ΠΎΠ»ΡΡΠ°Ρ =(')
ΠΠ°Π΄Π°ΡΠ° 6.2 (3 Π±Π°Π»Π»Π°)
ΠΠ»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ Π·Π°Π΄Π°Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΠ΅Π½Ρ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π³Π΅ΡΡΠΈΠ°Π½.
ΠΡΡΠΈΡΠ»ΠΈΡΠ΅ Π³Π΅ΡΡΠΈΠ°Π½ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ L, Π·Π°ΠΏΠΈΡΠΈΡΠ΅ ΠΎΡΠ²Π΅Ρ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅: ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΡΠΎ-ΡΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΠΎ Π·Π½Π°ΠΊΠΎΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡΡ ΡΡΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ?
<Π Π΅ΡΠ΅Π½ΠΈΠ΅>
ΠΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ Π·Π°ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΉΡΠ΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π³Π΅ΡΡΠΈΠ°Π½Π°. ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΡΡΠΈΠ½Ρ Π΄Π»Ρ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΡ ΠΌΠ°ΡΡΠΈΡ.
def logistic_hess(w, X, y):
'''
logistic_hess(w, X, y) Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ Π³Π΅ΡΡΠΈΠ°Π½ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° Π»ΠΎΠ³ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠΈ dL(w, X, y)/dw
w: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,)
X: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (N, M)
y: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,)
hessw: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M, M)
'''
hessw = # ΠΠ΅ΡΡΠΈΠ°Π½ dL/dw_iw_j
return hessw
assert(logistic_hess(w, X, y).shape == (w.shape[0], w.shape[0]))
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄ΡΡΡΡΠ° Π³Π΅ΡΡΠΈΠ°Π½Π°
ΠΠ»Ρ Π³Π΅ΡΡΠΈΠ°Π½Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ
$$[\nabla^2 f(x)]_{ij} \approx \frac{f(x + \epsilon \cdot e_i + \epsilon \cdot e_j) -f(x + \epsilon \cdot e_i) - f(x + \epsilon \cdot e_j)+ f(x)}{\epsilon^2}~~~~~~~~~~~~~~~~~~~~~$$Π³Π΄Π΅ $e_i = (0, ... , 0, 1, 0, ..., 0)$ - i-ΠΉ Π±Π°Π·ΠΈΡΠ½ΡΠΉ ΠΎΡΡ, $\epsilon \approx 10^{-5}$
def hess_finite_diff(func, w, eps=1e-5):
'''
w: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,)
func: ΡΠΊΠ°Π»ΡΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡ Π²Π΅ΠΊΡΠΎΡΠ½ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° w, func(w) = ΡΠΈΡΠ»ΠΎ
eps: np.float ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ°
dnum: np.array ΡΠ°Π·ΠΌΠ΅ΡΠ° (M,), ΡΠΈΡΠ»Π΅Π½Π½ΠΎ ΠΏΠΎΡΡΠΈΡΠ°Π½Π½ΡΠΉ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ
'''
w, fval, dnum = w.astype(np.float64), func(w).astype(np.float64), np.zeros((w.size, w.size), dtype=np.float64)
dnum = # ΠΡΡΠΈΡΠ»ΠΈΡΠ΅ ΡΠΈΡΠ»Π΅Π½Π½ΡΠΉ Π³Π΅ΡΡΠΈΠ°Π½ d func/dw_iw_j Π΄Π»Ρ Π²ΡΠ΅Ρ
i, j
return dnum
mat_grad = logistic_hess(w, X, y)
num_grad = hess_finite_diff(lambda w: logistic(w, X, y), w)
err = max_error(mat_grad, num_grad)
print('err = ', err)
print('ok' if max_error(mat_grad, num_grad) < 1e-5 else 'ΠΎΡΠΈΠ±ΠΊΠ° ΠΎΡ Π±ΠΎΠ»ΡΡΠ°Ρ =(')
ΠΠ°Π΄Π°ΡΠ° 6.3 (4+ Π±Π°Π»Π»ΠΎΠ²)
Π’Π°ΠΊ ΠΊΠ°ΠΊ Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π²ΡΠΏΡΠΊΠ»ΠΎΠΉ (ΡΠΌ. ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎ Π·Π½Π°ΠΊΠΎΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΡΡΡ ΠΠ΅ΡΡΠΈΠ°Π½Π°), Π΅Ρ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ΡΠ°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π²ΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ ΠΡΡΡΠΎΠ½Π°. ΠΠ°ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΡΠΎ Π² ΠΎΠ±ΡΠ΅ΠΌ Π²ΠΈΠ΄Π΅ ΠΌΠ΅ΡΠΎΠ΄ ΠΡΡΡΠΎΠ½Π° Π΄Π»Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ (ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ) $H(z) = 0$ ΠΈΠΌΠ΅Π΅Ρ Π²ΠΈΠ΄
$$z_{k+1} = w_k - \mathbf{\alpha_k}\left(\nabla H(z_k)\right)^{-1}H(z_k)$$ΠΠ½ΠΎΠΆΠΈΡΠ΅Π»Ρ $a_k$ Π½Π΅ Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠ°Π½ΠΎΠ½ΠΈΡΠ΅Π½, Π½ΠΎ Π΅Π³ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΊΠΎΡΡΡΡ ΡΡ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°ΡΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ $f(w) \rightarrow \min\limits_w$ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ Π½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π½ΡΠ»Π΅ΠΉ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ° $\nabla f(w) = 0$. ΠΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ:
$$w_{k + 1} = w_k - \alpha_k\left(\nabla^2 f(x_k)\right)^{-1} \cdot \nabla f(x_k) =: w_k - \alpha_k d_k$$ΠΠ½ΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΡΡΡΠΎΠ½Π° -- Π½Π° ΡΠ°Π³Π΅ $k$ Π²ΡΠ±ΡΠ°ΡΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΏΡΡΠΊΠ° $d_k$ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ° ΠΈ Π³Π΅ΡΡΠΈΠ°Π½Π°, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π΄Π»ΠΈΠ½Ρ ΡΠ°Π³Π° $\alpha_k$ ΠΏΠΎ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ $d_k$, ΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΡΡ ΡΠ΅ΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π΄ΠΎ ΡΡ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ (Π² Π²ΡΠΏΡΠΊΠ»ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ ΡΡΠΎ 20 ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ).
Π ΠΌΠ΅ΡΠΎΠ΄Π΅ ΠΡΡΡΠΎΠ½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊ
$$d_{k+1} = -(\nabla^2 f(x_k))^{-1} \cdot \nabla f(x_k)$$Π½ΠΎ, Π²ΠΎΡ Π±Π΅Π΄Π°, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ ΠΎΡΠ΅Π½Ρ Π΄ΠΎΡΠΎΠ³Π°Ρ ΠΈ Π½Π΅ ΡΡΡΠΎΠΉΡΠΈΠ²Π°Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΊΠ°ΡΡ $d_{k+1}$ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ
$$\nabla^2 f(x_k) d_{k+1} = -\nabla f(x_k)$$ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΡΡΡΠΎΠ½Π°.
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΎΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠ° ΠΈ Π³Π΅ΡΡΠΈΠ°Π½Π°, ΡΠΎ Π² ΡΡΠ½ΠΊΡΠΈΠΈ newton Π²Π°ΠΌ Π½Π΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΠ»ΠΎΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠ΅ ΠΌΠ°ΡΡΠΈΡΡ.
from scipy.optimize.linesearch import line_search_armijo
def newton(func, grad, hess, w0, solver, max_iter=20):
'''
func: ΡΠΊΠ°Π»ΡΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡ Π²Π΅ΠΊΡΠΎΡΠ° ΡΠ°Π·ΠΌΠ΅ΡΠ° shape(w0)
grad: ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»ΡΡΡΠ°Ρ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ func
hess: ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΠΈΡΠ»ΡΡΡΠ°Ρ Π³Π΅ΡΡΠΈΠ°Π½ ΡΡΠ½ΠΊΡΠΈΠΈ func
w0: Π²Π΅ΠΊΡΠΎΡ, ΠΏΠ΅ΡΠ²Π°Ρ ΡΠΎΡΠΊΠ° Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
solver: ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡ Π΄Π²ΡΡ
Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² A, b Π½Π°Ρ
ΠΎΠ΄ΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Ax=b
max_iter: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄Π°
'''
x, fvals, ngrads = x0.copy().astype(np.float), [], []
for iter in range(max_iter):
fvalx, gradx, hessx = func(x), grad(x), hess(x)
d = # Π Π΅ΡΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ hess * x = grad
alpha = # ΠΠΎΠΈΡΠΊ ΡΠ°Π³Π° ΠΏΠΎ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ d, Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±ΡΡΡΡΠΎΠΉ ΠΎΠ΄Π½ΠΎΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ line_search_armijo
x = # Π¨Π°Π³ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΏΠΎ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ d Ρ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠΌ alpha
fvals.append(fvalx)
ngrads.append(np.linalg.norm(gradx))
return x, fvals, ngrads
# ΠΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΡΡΠΊΠ°
func = lambda w: logistic(w, X, y)
grad = lambda w: logistic_grad(w, X, y)
hess = lambda w: logistic_hess(w, X, y)
gauss_ = lambda A, b: spla.spsolve(A, b) if sps.issparse(A) else sla.solve(A, b)
lgmres_ = lambda A, b: spla.lgmres(A, b, tol=1e-2)[0]
cg_ = lambda A, b: spla.cg(A, b, tol=1e-2)[0]
%time w_opt, fvals, ngrads = newton(func, grad, hess, w, cg_)
Π ΡΡΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΉ (Π³Π°ΡΡΡ, CG, GMRES) ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ:
tol);ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΡ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π½Π°Π±ΠΎΡΠ°Ρ Π΄Π°Π½Π½ΡΡ . Π Π°ΡΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠΈ ΡΠΈΡΡΠ°ΡΠΈΠΈ:
ΠΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠΎΡΡΡΡΡ Π»ΡΠ±ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠΏΡΡΠ°Π΅ΡΠ΅ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΡΡ Π·Π½Π°ΡΠΈΠΌΠΎΡΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ²: Π²Π΅Π΄Ρ Π΅ΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Π°Π» ΡΠ΅Π±Ρ Π»ΡΡΡΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ-Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ΅, ΡΠΎ ΡΡΠΎ Π΅ΡΡ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π·Π½Π°ΡΠΈΡ.
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡ: ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΈ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°ΡΠ°ΡΡ Ρ ΡΠ°ΠΉΡΠ° LIBSVM1: a9a, w8a (ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΡΡΠ°Π²Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ²) ΠΈ colon-cancer (Π² Π½ΡΠΌ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ°Π»ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π½ΠΎ Π·Π°ΡΠΎ Π³ΠΎΡΠ°Π·Π΄ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΎΠ²).
ΠΡΠ±ΠΎΠΉ Π½Π°Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ Ρ ΡΠ°ΠΉΡΠ° LIBSVM ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ· ΡΠ΅Π±Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» Π² ΡΠΎΡΠΌΠ°ΡΠ΅ svmlight. Π§ΡΠΎΠ±Ρ ΡΡΠΈΡΠ°ΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ», ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ load_svmlight_file ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ sklearn.datasets. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΠ΅Π³Π΄Π° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΌΠ°ΡΡΠΈΡΡ X ΡΠΈΠΏΠ° sp.sparse.csr_matrix (ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½Π°Ρ ΠΌΠ°ΡΠΈΡΠ°). Π Π΄Π°ΡΠ°ΡΠ΅ΡΠ΅ colon-cancer ΠΌΠ°ΡΡΠΈΡΠ° X Π½Π΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΠΎΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ load_svmlight_file ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ X ΠΊ ΡΠΈΠΏΡ np.ndarray. ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ X = X.toarray().
# Your code here
ΠΠ°Π΄Π°ΡΠ° 6.4 (0 Π±Π°Π»ΠΎΠ², Π²Π΅ΡΡ ΠΊΠΎΠ΄ Π½Π°ΠΏΠΈΡΠ°Π½ Π·Π° ΠΠ°Ρ, Π½ΠΎ ΠΎΡΠ΅Π½Ρ ΠΊΡΠ°ΡΠΈΠ²ΡΠ΅ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ)
ΠΠ°Π²Π°ΠΉΡΠ΅ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π½Π°Ρ ΠΌΠ΅ΡΠΎΠ΄, Π° ΡΠΎ Ρ ΠΎΡΠ΅ΡΡΡ Π³Π»Π°Π·Π°ΠΌΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ. ΠΡΠΎΡΡΠΎ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΊΠΎΠ΄:
from scipy import optimize
def expand(X):
X_ = np.zeros((X.shape[0], 6))
X_[:,0:2] = X
X_[:,2:4] = X**2
X_[:,4] = X[:,0] * X[:,1]
X_[:,5] = 1;
return X_
def visualize(X, y, w, loss, n_iter, h=0.01):
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
plt.clf()
Z = classify(expand(np.c_[xx.ravel(), yy.ravel()]), w)
Z = Z.reshape(xx.shape)
plt.subplot(1,2,1)
plt.contourf(xx, yy, Z, cmap='rainbow', alpha=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='rainbow')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.subplot(1,2,2)
plt.plot(loss)
ymin, ymax = plt.ylim()
plt.ylim(0, ymax)
display.clear_output(wait=True)
display.display(plt.gcf())
def viz_opt(func, gradf, hessf, X, y, n_iter=10):
a = None
loss1 = np.zeros(n_iter)
plt.figure(figsize=(12,5))
ind = np.arange(X.shape[0])
w, d = np.zeros(X.shape[1]), np.zeros(X.shape[1])
for i in range(n_iter):
loss1[i] += func(w)
visualize(X, y, w, loss1, n_iter)
fvalx, gradx, hessx = func(w), grad(w), hess(w)
d = cg(hessx, -gradx)[0]
alpha = line_search_armijo(func, w, d, gradx, fvalx)[0]
w += alpha*d
visualize(X, y, w, loss1, n_iter)
q = plt.clf()
plt.show()
from sklearn.datasets import make_moons, make_circles, make_classification
X, y = make_classification(n_features=2, n_redundant=0, n_informative=2)
X += np.random.random(X.shape)
datasets = [make_moons(noise=0.1), make_circles(noise=0.1, factor=0.5), (X, y)]
from IPython import display
def classify(X, w):
return np.sign(1.0 / (1.0 + np.exp(-X.dot(w))) - 0.5)
func = lambda w: logistic(w, X, y)
grad = lambda w: logistic_grad(w, X, y)
hess = lambda w: logistic_hess(w, X, y)
for X, y in datasets:
X, y = expand(X), -2*(y-0.5)
a = viz_opt(func, grad, hess, X, y)