【データサイエンティスト入門】科学計算、データ加工、グラフ描画ライブラリの使い方の基礎♬Scipyの基礎

昨夜は、[【データサイエンティスト入門】科学計算、データ加工、グラフ描画ライブラリの使い方の基礎としてNumpyの基礎](https://qiita.com/MuAuan/items/d4d3859bdc01f84b623c)をまとめましたが、今夜はScipyの基礎をまとめます。ただし、Scipyは無暗に写経しても理解は難しいのと膨大なので、本書に乗った解説を補足することとします。
【注意】
[「東京大学のデータサイエンティスト育成講座」](https://www.amazon.co.jp/%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%83%86%E3%82%A3%E3%82%B9%E3%83%88%E8%82%B2%E6%88%90%E8%AC%9B%E5%BA%A7-Python%E3%81%A7%E6%89%8B%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6%E3%83%87%E2%80%95%E3%82%BF%E5%88%86%E6%9E%90-%E5%A1%9A%E6%9C%AC%E9%82%A6%E5%B0%8A/dp/4839965250/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)を読んで、ちょっと疑問を持ったところや有用だと感じた部分をまとめて行こうと思う。
したがって、あらすじはまんまになると思うが内容は本書とは関係ないと思って読んでいただきたい。
###Scipyの基礎
Scipyは、科学技術計算をするためのライブラリで、多様な数学処理（線形代数の計算、フーリエ変換など）が出来ます。
ここでは、線形代数の逆行列や固有値、方程式の解などを求めてみましょう。
※固有値問題はnumpyでも出来ましたが計算速度はScipyの方が速いです
####2-3-1 Scipyライブラリのインポート
```py
>>> import scipy as sp
>>> import scipy.linalg as linalg
>>> from scipy.optimize import minimize_scalar
```
####2-3-2 行列計算
#####2-3-2-1 行列式と逆行列の計算
```py
>>> matrix = np.array([[1,-1,-1],[-1,1,-1],[-1,-1,1]])
>>> matrix
array([[ 1, -1, -1],
       [-1,  1, -1],
       [-1, -1,  1]])
>>> print('行列式', linalg.det(matrix))
行列式 -4.0
>>> print('逆行列','\n', linalg.inv(matrix))
逆行列
 [[ 0.  -0.5 -0.5]
 [-0.5 -0.  -0.5]
 [-0.5 -0.5  0. ]]
>>> print('行列の積','\n',matrix.dot(linalg.inv(matrix)))
行列の積
 [[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]
>>> matrix*linalg.inv(matrix)   #numpyの要素積
array([[ 0. ,  0.5,  0.5],
       [ 0.5, -0. ,  0.5],
       [ 0.5,  0.5,  0. ]])
>>> matrix@linalg.inv(matrix)   #numpyの積
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
```
#####2-3-2-2 固有値と固有ベクトル
```py
>>> eig_value, eig_vector = linalg.eig(matrix)
>>> print('固有値','\n',eig_value)
固有値
 [-1.+0.j  2.+0.j  2.+0.j]
>>> print('固有ベクトル','\n',eig_vector)
固有ベクトル
 [[ 0.57735027 -0.81649658  0.42755853]
 [ 0.57735027  0.40824829 -0.81618716]
 [ 0.57735027  0.40824829  0.38862863]]
>>> eig_value, eig_vector = np.linalg.eig(matrix)  #numpyでも同じ
>>> print('固有ベクトル','\n',eig_vector)
固有ベクトル
 [[ 0.57735027 -0.81649658  0.42755853]
 [ 0.57735027  0.40824829 -0.81618716]
 [ 0.57735027  0.40824829  0.38862863]]
>>> print('固有値','\n',eig_value)   #固有値は実数表記
固有値
 [-1.  2.  2.]
```
scipy.linalg vs numpy.linalgについて
【参考】
[Linear Algebra (scipy.linalg)](https://docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/linalg.html)
「scipy.linalgには、numpy.linalgのすべての関数が含まれています。加えて、numpy.linalgに含まれていない他のいくつかのより高度なものが含まれています」
「numpy.linalgよりもscipy.linalgを使用するもう1つの利点は、常にBLAS / LAPACKサポートを使用してコンパイルされるのに対し、numpyの場合はオプションです。したがって、numpyのインストール方法によっては、scipyのバージョンの方が速い場合があります。」
「したがって、numpyプログラムへの依存関係としてscipyを追加したくない場合を除いて、numpy.linalgの代わりにscipy.linalgを使用します。」
####2-3-3 ニュートン法
最適化計算の例
#####2-3-3-1 方程式の解
```py
>>> def my_function(x):
...     return (x**2 + 2*x + 1)
...
>>> from scipy.optimize import newton
>>> newton(my_function,0)
-0.9999999852953906
```
#####2-3-3-2 最小値を求める
[Brent法](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AC%E3%83%B3%E3%83%88%E6%B3%95)を利用して、my_function()の最小値を求める。

```py
>>> minimize_scalar(my_function, method = 'Brent')
     fun: 0.0
    nfev: 9
     nit: 4
 success: True
       x: -1.0000000000000002
```

######練習問題2-6
```py
>>> def my_function2(x):
...     return (x**3 + 2*x + 1)
...
>>> newton(my_function2,0)
-0.45339765151640365
```
###SciPy Tutorial
ちょっと、これだけだと単にほんとの入り口の使い方しか書けていないので、以下そのうち、写経したいと思います。
[SciPy Tutorial](https://docs.scipy.org/doc/scipy/reference/tutorial/index.html)
[Introduction](https://docs.scipy.org/doc/scipy/reference/tutorial/general.html)
[Basic functions](https://docs.scipy.org/doc/scipy/reference/tutorial/basic.html)
[Special functions (scipy.special)](https://docs.scipy.org/doc/scipy/reference/tutorial/special.html)
[Integration (scipy.integrate)](https://docs.scipy.org/doc/scipy/reference/tutorial/integrate.html)
[Optimization (scipy.optimize)](https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html)
[Interpolation (scipy.interpolate)](https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html)
[Fourier Transforms (scipy.fft)](https://docs.scipy.org/doc/scipy/reference/tutorial/fft.html)
[Signal Processing (scipy.signal)](https://docs.scipy.org/doc/scipy/reference/tutorial/signal.html)
[Linear Algebra (scipy.linalg)](https://docs.scipy.org/doc/scipy/reference/tutorial/linalg.html)
[Sparse eigenvalue problems with ARPACK](https://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html)
[Compressed Sparse Graph Routines (scipy.sparse.csgraph)](https://docs.scipy.org/doc/scipy/reference/tutorial/csgraph.html)
[Spatial data structures and algorithms (scipy.spatial)](https://docs.scipy.org/doc/scipy/reference/tutorial/spatial.html)
[Statistics (scipy.stats)](https://docs.scipy.org/doc/scipy/reference/tutorial/stats.html)
[Multidimensional image processing (scipy.ndimage)](https://docs.scipy.org/doc/scipy/reference/tutorial/ndimage.html)
[File IO (scipy.io)](https://docs.scipy.org/doc/scipy/reference/tutorial/io.html)
###まとめ
・本書のScipyの基礎をまとめた
・Scipyはnumpyと被るものも多いが、基本Scipyの方が高速であるようだ

・SciPy Tutorialはボリュームはあるが面白い例が多く勉強になりそうなのでまとめたいと思う