<a href="https://colab.research.google.com/github/kalz2q/mycolabnotebooks/blob/master/linear_numpy_short.ipynb" target="_parent"></a>

# numpy と 線形代数

線形代数を学ぶには numpy と sympy の両方が必要である。 

numpy でないと機械学習なのど高速な計算ができないし、sympy でないと数式処理ができない。

* 行列計算
* 行列方程式を解く
* 逆行列と行列式を計算する



# 行列計算

次の例を考える

$$
A = \begin{pmatrix}
5 & 6 & 2\\
4 & 7 & 19\\
0 & 3 & 12
\end{pmatrix}
$$

$$
B = \begin{pmatrix}
14 & -2 & 12\\
4 & 4 & 5\\
5 & 5 & 1
\end{pmatrix}
$$


numpy を使うためには import する必要がある。


```python
import numpy as np
A = np.matrix([[5, 6, 2],
               [4, 7, 19],
               [0, 3, 12]])
B = np.matrix([[14, -2, 12],
               [4, 4, 5],
               [5, 5, 1]])
print(A)
print(B)
```

    [[ 5  6  2]
     [ 4  7 19]
     [ 0  3 12]]
    [[14 -2 12]
     [ 4  4  5]
     [ 5  5  1]]


同じことを sympy でやってみると次のようになる。


```python
# 同じことを sympy でやってみると
from sympy import *
A_sympy = Matrix([[5, 6, 2],
               [4, 7, 19],
               [0, 3, 12]])
B_sympy = Matrix([[14, -2, 12],
               [4, 4, 5],
               [5, 5, 1]])
display(A_sympy)
display(B_sympy)
```


$\displaystyle \left[\begin{matrix}5 & 6 & 2\\4 & 7 & 19\\0 & 3 & 12\end{matrix}\right]$



$\displaystyle \left[\begin{matrix}14 & -2 & 12\\4 & 4 & 5\\5 & 5 & 1\end{matrix}\right]$


次の計算をする

* $5A$
* $A ^ 3$ 
* $A + B$;
* $A - B$;
* $AB$


```python
print(A)
print(5 * A)
print(A**2)
print(A**3)
print(A+B)
print(A-B)
print(A*B)

```

    [[ 5  6  2]
     [ 4  7 19]
     [ 0  3 12]]
    [[25 30 10]
     [20 35 95]
     [ 0 15 60]]
    [[ 49  78 148]
     [ 48 130 369]
     [ 12  57 201]]
    [[ 557 1284 3356]
     [ 760 2305 6994]
     [ 288 1074 3519]]
    [[19  4 14]
     [ 8 11 24]
     [ 5  8 13]]
    [[ -9   8 -10]
     [  0   3  14]
     [ -5  -2  11]]
    [[104  24  92]
     [179 115 102]
     [ 72  72  27]]


# いまここ

---
練習問題 $\quad$  Compute $A ^ 2 - 2 A + 3$ with:

$$A = 
\begin{pmatrix}
1 & -1\\
2 & 1
\end{pmatrix}
$$

---

## Solving Matrix equations

We can use Numpy to (efficiently) solve large systems of equations of the form:

$$Ax=b$$

Let us illustrate that with:

$$
A = \begin{pmatrix}
5 & 6 & 2\\
4 & 7 & 19\\
0 & 3 & 12
\end{pmatrix}
$$

$$
b = \begin{pmatrix}
-1\\
2\\
1 
\end{pmatrix}
$$


```python
A = np.matrix([[5, 6, 2],
               [4, 7, 19],
               [0, 3, 12]])
b = np.matrix([[-1], [2], [1]])
```

We use the `linalg.solve` command:


```python
x = np.linalg.solve(A, b)
x
```




    matrix([[ 0.45736434],
            [-0.62790698],
            [ 0.24031008]])



We can verify our result:


```python
A * x
```




    matrix([[-1.],
            [ 2.],
            [ 1.]])



---
練習問題 $\quad$  行列方程式 $Bx=b$ を解く。



---
# 逆行列と行列式を求める

逆行列は次のようにして求められる。


```python
# 逆行列は inv を使って求める
Ainv = np.linalg.inv(A)
Ainv
```




    matrix([[-0.20930233,  0.51162791, -0.7751938 ],
            [ 0.37209302, -0.46511628,  0.6744186 ],
            [-0.09302326,  0.11627907, -0.08527132]])



$A^{-1}A=\mathbb{1}$ となることを確認する。


```python
A * Ainv
```




    matrix([[  1.00000000e+00,   2.77555756e-17,   3.05311332e-16],
            [ -2.08166817e-16,   1.00000000e+00,  -2.08166817e-16],
            [  5.55111512e-17,  -5.55111512e-17,   1.00000000e+00]])



若干見にくいが、[[1,0,0],[0,1,0],[0,0,1]] であることがわかる。


行列式は次のように求める。


```python
# 行列式
np.linalg.det(A)
```




    -129.00000000000009



---

練習問題 $\quad$ 行列 $B$ の逆行列と行列式を求める。





4a74bb475fb60a232c495d3de786b65d365be035
ipynb
Jupyter Notebook
linear_numpy_short.ipynb
kalz2q/-yjupyternotebooks
ba37ac7822543b830fe8602b3f611bb617943463
MIT
2021-09-16T03:45:19.000Z
2021-09-16T03:45:19.000Z
linear_numpy_short.ipynb
kalz2q/-yjupyternotebooks
ba37ac7822543b830fe8602b3f611bb617943463
MIT
linear_numpy_short.ipynb
kalz2q/-yjupyternotebooks
ba37ac7822543b830fe8602b3f611bb617943463
MIT
Qwen/Qwen-72B
1. YES
2. YES