Лабораторная работа 1

НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

In [17]:
# Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ
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

Часть 1. Особенности LU-разложения

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ разлоТСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌΠΈ: ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ сомноТитСлСй всСгда равняСтся исходной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ $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$. А Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΡŒΡ‚Π΅ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС всСх Π΅Π΄ΠΈΠ½ΠΈΡ† ΠΏΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ дСсятичныС Ρ‚ΠΎΡ‡ΠΊΠΈ. ИзмСнился Π»ΠΈ ΠΎΡ‚Π²Π΅Ρ‚? Как Π²Π°ΠΌ каТСтся, ΠΏΠΎΡ‡Π΅ΠΌΡƒ?

In [18]:
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))
[[1e-20 1]
 [1.0 1]]
[[1e-20 1.0]
 [1.0 0.0]]

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ послСднСго элСмСнта Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС, ΠΊΠΎΠ³Π΄Π° всС вычислСния Π΄Π΅Π»Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ»Π°Π²Π°ΡŽΡ‰ΠΈΡ… Ρ‚ΠΎΡ‡ΠΊΠ°Ρ….

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС Ρ‡Π°ΡΡ‚ΡŒ вычислСний дСлаСтся Π² Ρ†Π΅Π»Ρ‹Ρ… числах (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² bigint), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ. ΠŸΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡŒ ΠΆΠ΅ вычислСний с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ $ \approx 10^{-17} $, ΠΈ Ρ‚Π°ΠΌ Π½Π΅Π²Π΅Ρ€Π΅Π½ Π΄Π°ΠΆΠ΅ послСдний элСмСнт ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ $U$, Π² Π½Ρ‘ΠΌ тСряСтся слагаСмоС $1$.

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… вычислСниях ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ элСмСнты ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка с самого Π½Π°Ρ‡Π°Π»Π° Π±ΡƒΠ΄ΡƒΡ‚ числами с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (Π° Π½Π΅ Ρ†Π΅Π»Ρ‹ΠΌΠΈ).

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ QR-Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ исходной ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ $Q$ ΠΈ $R$.

In [19]:
q, r = np.linalg.qr(L.dot(U))
print(q)
print(r)
print(q.dot(r))
[[ 0. -1.]
 [-1.  0.]]
[[-1. -1.]
 [ 0. -1.]]
[[ 0.  1.]
 [ 1.  1.]]

Наоборот, ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΡŒ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ элСмСнтС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, ΠΎΠ½ обнулился, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ мСньшС машинной точности.

Π’Ρ‹Ρ…ΠΎΠ΄: 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$?

In [0]:
 

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ‚Π°ΠΊ Ρ€Π΅Π΄ΠΊΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ (Ρ‡Ρ‘Ρ€Ρ‚ Π΅Π³ΠΎ Π·Π½Π°Π΅Ρ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ). Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, 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$. НС такая ΡƒΠΆ ΠΈ большая, ΠΏΡ€Π°Π²Π΄Π°?

In [0]:
###
# Your function here

###

A = my_pascal(30)

# Find ||A - PLU||_2 here

Π’Π΅ΠΏΠ΅Ρ€ΡŒ попросим ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Паскаля $30\times30$ ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΡƒΡŽ систСму ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ:

In [0]:
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-разлоТСния. Π‘Ρ‚Π°Π½Π΅Ρ‚ Π»ΠΈ Π»ΡƒΡ‡ΡˆΠ΅?

In [0]:
Q, R = sla.qr(A)
x2 = sla.solve_triangular(R, Q.T.dot(b))
print(sla.norm(x2 - x))

ΠžΠ±ΡŠΡΡΠ½ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ нСприятныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.


Π’Π°Ρˆ ΠΎΡ‚Π²Π΅Ρ‚

Часть 2. Решение СЛАУ с положительно определённой матрицей

Π—Π°Π΄Π°Π½ΠΈΠ΅ 2.1. КакиС ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ? (3 Π±Π°Π»Π»Π°)

Π Π΅Π°Π»ΠΈΠ·ΡƒΠΉΡ‚Π΅ нСсколько Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ БЛАУ $Ax = b$, Π³Π΄Π΅ $A = A^T$, $A \geqslant 0$ с ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠΉ ΠΏΡ€Π°Π²ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ $b$.

  1. Наивный способ: $x = A^{-1}b$;

  2. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ способ: с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ solve модуля scipy.linalg;

  3. Π Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π₯ΠΎΠ»Π΅Ρ†ΠΊΠΎΠ³ΠΎ: с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ разлоТСния Π₯ΠΎΠ»Π΅Ρ†ΠΊΠΎΠ³ΠΎ для ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ $A$ ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π΄Π²ΡƒΡ… БЛАУ с Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ;

  4. Π Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π₯ΠΎΠ»Π΅Ρ†ΠΊΠΎΠ³ΠΎ с ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ scipy: с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ разлоТСния Π₯ΠΎΠ»Π΅Ρ†ΠΊΠΎΠ³ΠΎ для ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ $A$ ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° scipy.linalg (cho_factor, cho_solve).

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ БЛАУ с Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΎΠΉ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ solve_triangular ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π° scipy.linalg.

In [0]:
def naive_solve(A, b):
    # Your code here
    
# And so on and so forth

ΠŸΡ€ΠΎΠ²Π΅Π΄ΠΈΡ‚Π΅ тСстированиС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π½Π° нСбольшой БЛАУ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ совпадСния ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ²

In [0]:
 

ΠŸΡ€ΠΎΠ²Π΅Π΄ΠΈΡ‚Π΅ экспСримСнты ΠΈ выяснитС, ΠΊΠ°ΠΊ мСняСтся врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ этих ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

  • с ростом Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ $A$ ΠΏΡ€ΠΈ фиксированном числС ΠΏΡ€Π°Π²Ρ‹Ρ… частСй. РассмотритС систСмы с 10, 100, 1000 ΠΏΡ€Π°Π²Ρ‹Ρ… частСй;

  • с ростом числа ΠΏΡ€Π°Π²Ρ‹Ρ… частСй ΠΏΡ€ΠΈ фиксированном Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ $A$ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, $100\times100$).

ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ нарисуйтС Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ (врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°). Какой ΠΌΠ΅Ρ‚ΠΎΠ΄ оказываСтся Π±ΠΎΠ»Π΅Π΅ быстрым?

Для тСстирования Π²Π°ΠΌ пригодятся случайныС ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, сгСнСрированныС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ numpy.random.randn. Но Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π² Π·Π°Π΄Π°Ρ‡Π΅ Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ симмСтричСских ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°Ρ…. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅, ΠΊΠ°ΠΊ ΠΈΠ· случайных ΠΌΠ°Ρ‚Ρ€ΠΈΡ† ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ симмСтричСскиС ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Π΅.

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹ Π»Π΅Π²Ρ‹Ρ… частСй Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ $100\times100$: ΠΏΡ€ΠΈ ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… размСрностях Π·Π°ΠΌΠ΅Ρ‚Π½ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Ρ„Π°ΠΊΡ‚ΠΎΡ€Ρ‹, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ Π°Π»Π³Π΅Π±Ρ€Π΅. ΠœΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ систСмы с ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΡ‚ 100 Π΄ΠΎ 1000 ΠΈ с числом ΠΏΡ€Π°Π²Ρ‹Ρ… частСй ΠΎΡ‚ 10 Π΄ΠΎ 10000. ΠŸΡ€ΠΈΠ³ΠΎΡ‚ΠΎΠ²ΡŒΡ‚Π΅ΡΡŒ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ экспСримСнты ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π½ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ врСмя.

In [0]:
 

Π—Π°Π΄Π°Π½ΠΈΠ΅ 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$.

In [0]:
#Π—Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°:
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

In [0]:
 

Π—Π°ΠΌΠ΅Ρ€ΡŒΡ‚Π΅ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ вашСго Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ scipy.stats.multivariate_normal.logpdf для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ $D$. ΠŸΠΎΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π» ΠΏΠΎ скорости Ρƒ стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

In [0]:
 

Π’ Π·Π°Π΄Π°Ρ‡Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒΡΡ:

  • ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π»ΠΈ Π²Π°ΠΌ ΠΎΠ±ΠΎΠ³Π½Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ;
  • ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π»ΠΈ Π²Ρ‹ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ разлоТСния (ΠΈΠ»ΠΈ просто ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠ»ΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ:))
  • Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ

Часть 3. Разреженные матрицы

ΠœΠ°Ρ‚Ρ€ΠΈΡ†Π° называСтся Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½ΠΎΠΉ, Ссли Π² Π½Π΅ΠΉ ΠΌΠ°Π»ΠΎ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… элСмСнтов.

НапримСр, Ссли Π² ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π΅ $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

In [0]:
import scipy.io as sio
In [0]:
A = sio.mmread(r'...\sparse_matrix1.mtx') # Please type right folder name! 

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ располоТСны Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ элСмСнты ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹:

In [0]:
plt.spy(A, marker='.', markersize=0.4)

Π’ ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠ· пяти Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² хранится ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°? Для ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π° этот вопрос Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ type.

Бколько Π² Π½Π΅ΠΉ Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹Ρ… элСмСнтов?

In [0]:
 

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ.

In [5]:
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
Out[5]:
COO DOK LIL CSR CSC
COO NaN 0.064994 0.017649 0.000432 0.000536
DOK 0.104156 NaN 0.155717 0.103632 0.106420
LIL 0.014274 0.081863 NaN 0.014238 0.014916
CSR 0.000810 0.067233 0.013615 NaN 0.000494
CSC 0.000709 0.070901 0.015557 0.000509 NaN

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, быстрСС всСго прСобразования происходят ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ 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$ --- ΠΎΠ±Ρ‰Π΅Π΅ число Ρ‡Π΅ΠΊΠΎΠ². Π’ ΠΊΠ°ΠΊΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ эту (ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½ΡƒΡŽ) ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ? ΠŸΠΎΡ‡Π΅ΠΌΡƒ?


Π’Π°Ρˆ ΠΎΡ‚Π²Π΅Ρ‚:

ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ максимально эффСктивный ΠΊΠΎΠ΄, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ эту ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρƒ:

In [0]:
def CreateMatrix(receipts):
    # Your code here
    
    for receipt in receipts:
        # Your code here

Π—Π°Π΄Π°Π½ΠΈΠ΅ 3.3 (1 Π±Π°Π»Π») Π’ ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠ· Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² LIL ΠΈ COO ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π²Π΅ΠΊΡ‚ΠΎΡ€ происходит быстрСС? ΠŸΠΎΡ‡Π΅ΠΌΡƒ? ΠŸΡ€ΠΎΠ²Π΅Π΄ΠΈΡ‚Π΅ экспСримСнты. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ scipy.sparse.random для создания случайных Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

Насколько быстрСС с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ CSC ΠΈ CSR?

In [0]:
#Your experiments

Π’Π°Ρˆ ΠΎΡ‚Π²Π΅Ρ‚:

Часть 4. Итерационные методы

Π’ этом Π·Π°Π΄Π°Π½ΠΈΠΈ Π²Π°ΠΌ прСдлагаСтся ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ систСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ.

Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ scipy.sparse.linalg (http://docs.scipy.org/doc/scipy-0.14.0/reference/sparse.linalg.html). ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ!

Π’ этом Π·Π°Π΄Π°Π½ΠΈΠΈ Π²Π°ΠΌ прСдстоит ΠΏΠΎΠ±Π»ΠΈΠΆΠ΅ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с двумя ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ:

  1. (L)GMRES (ΠΌΡ‹ Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ scipy.sparse.linalg.lgmres, Π΄Π°ΠΆΠ΅ Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΉ GMRES)

  2. CG (вызываСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ scipy.sparse.linalg.cg)

ЗамСчания:

  1. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ scipy.sparse.linalg.lgmres ΠΈ scipy.sparse.linalg.cs устроСны Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ уравнСния Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π²Π΅ΠΊΡ‚ΠΎΡ€Π½ΠΎΠΉ ΠΏΡ€Π°Π²ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ.
  2. Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡŒΡ‚Π΅ΡΡŒ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ (Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ scipy.sparse.linalg.lgmres ΠΈΡ… ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ) ΠΈ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.
  3. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ/ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Для этого сущСствуСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ callback: это функция с сигнатурой callback(xk), вызываСмая Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Π•Ρ‘ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ xk - это Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ΅Π½ΠΈΠ΅ $x_k$. Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ lgmres, ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‰Π΅ΠΉ Π½ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ приблиТСния:
In [0]:
x = spla.gmres(A, b, callback=lambda xk: print(sla.norm(xk))

Если Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ Π΄Π΅Π»Π°, Π»ΠΎΠ³ΠΈΡ‡Π½Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для этого класс. НиТС ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ класса, ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‰Π΅Π³ΠΎ число ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ выводящСго (Ссли ΡƒΠΊΠ°Π·Π°Π½ Ρ„Π»Π°Π³ disp) Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎ всС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ приблиТСния (Π½Π΅ Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… систСм! Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ памяти):

In [0]:
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$:

In [0]:
M = spla.LinearOperator(A.shape, lambda x: spla.spsolve(P, x))

x = spla.lgmres(A, b, M=M)

А Π²ΠΎΡ‚ ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ LU-разлоТСния:

In [0]:
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.

In [0]:
# Your solution here

Часть 5. Матричные дифференцирования

Π—Π°Π΄Π°Ρ‡Π° 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$.

Часть 6. Линейная Алгебра и Машинное Обучение

Π₯ΠΎΡ€ΠΎΡˆΠ΅Π΅ Π·Π½Π°Π½ΠΈΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ Π² соврСмСнном машинном ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠΈ. Π’ этом Π·Π°Π΄Π°Π½ΠΈΠΈ Π’Π°ΠΌ прСдлагаСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ машинного обучСния ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² знания ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ диффСрСнцирования ΠΈ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ систСм ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ :)

Π’ области машинного обучСния ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· самых популярных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ классификации (прСдсказываСм ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… классов, $+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)$. Π’ Π΄Π°Π½Π½ΠΎΠΉ части Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ Π°Π»Π³Π΅Π±Ρ€Ρ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ.

План Ρƒ нас Ρ‚Π°ΠΊΠΎΠΉ:

  • Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ $L$, эффСктивно Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ сСбя
  • Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ гСссиан Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ $L$, эффСктивно Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ сСбя
  • Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ порядка для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
  • Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ вмСсто обращСния ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹, Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ систСму ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°
  • Π˜ΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ систСмы ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Для тСстирования ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ вычислСния сгСнСрируСм Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ нСбольшого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°

In [0]:
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(-(Β·))).

In [0]:
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
In [0]:
logistic(w, X, y)

Π—Π°Π΄Π°Ρ‡Π° 6.1 (2 Π±Π°Π»Π»Π°)

НайдитС Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ $\nabla_w L(w, X, y)$, Π·Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

<РСшСниС>

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠΉΡ‚Π΅ вычислСниС Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π° (ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ!)

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ† понадобится Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠΎΠ΄.

In [0]:
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
In [0]:
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}$

Π’Π°ΡˆΠ° функция Π΄ΠΎΠ»ΠΆΠ½Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ хотя Π±Ρ‹ с ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΌΠΈ (Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π°ΠΌΠΈ)

In [0]:
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
In [0]:
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, Π·Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅: МоТно Π»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ Π·Π½Π°ΠΊΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡ‚ΡŒ этой ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹?

<РСшСниС>

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠΉΡ‚Π΅ вычислСниС гСссиана. НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ€ΡƒΡ‚ΠΈΠ½Ρƒ для Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Ρ€ΠΈΡ†.

In [0]:
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
In [0]:
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}$

In [0]:
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
In [0]:
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 Π²Π°ΠΌ Π½Π΅ понадобилось ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Ρ‹.

In [0]:
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
In [0]:
# ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запуска

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);
  • ΠΊΠ°ΠΊΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ Π½Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ систСмы ΡƒΡ€Π°Π²Π½Π΅Π½ΠΈΠΉ ΠΈ ΠΊΠ°ΠΊΡƒΡŽ Π½Π° вычислСниС гСссиана ΠΈ Π³Ρ€Π°Π΄ΠΈΠ΅Π½Ρ‚Π°.

ЭкспСримСнты Π½ΡƒΠΆΠ½ΠΎ провСсти Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π½Π°Π±ΠΎΡ€Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. РассмотритС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ ситуации:

  • ΠΌΠ°Π»ΠΎΠ΅ число ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² d < 100
  • срСднСС число ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² d ~ 500
  • большоС число ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠ² d ~ 1000

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠΎΡ‰Ρ€ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ исслСдования, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π·Π½Π°Ρ‡ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² экспСримСнтов: вСдь Ссли ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Π°Π» сСбя Π»ΡƒΡ‡ΡˆΠ΅ Π² ΠΎΠ΄Π½ΠΎΠΌ-СдинствСнном экспСримСнтС, Ρ‚ΠΎ это Π΅Ρ‰Ρ‘ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚.

РСкомСндация: ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Ρ€ΠΈ Π½Π°Π±ΠΎΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ с сайта 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().

In [0]:
# Your code here

Π—Π°Π΄Π°Ρ‡Π° 6.4 (0 Π±Π°Π»ΠΎΠ², вСсь ΠΊΠΎΠ΄ написан Π·Π° Вас, Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ красивыС ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ)

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ наш ΠΌΠ΅Ρ‚ΠΎΠ΄, Π° Ρ‚ΠΎ хочСтся Π³Π»Π°Π·Π°ΠΌΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ. ΠŸΡ€ΠΎΡΡ‚ΠΎ запуститС ΠΊΠΎΠ΄:

In [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()
In [0]:
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)]
In [0]:
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)