ゼロから作るDeep Learning 1章 Python入門 備忘録

# はじめに
どうもお久しぶりです、ろんです（名前変えた）。

研究やインターン、Web開発で機械学習に興味が出てきて勉強したいなと思い機械学習を勉強することにしました。
何やらオーム社の「ゼロから作るDeep Learning」が初学者におすすめということなので、こちらを読んで備忘録を書いていこうと思います。
なんとPython未経験でも読み進められるとかなんとか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/59a5fd1f-d99f-2f39-0eb9-cf745fd28440.png)

ゼミ発表この記事見せておしまいがいいなあ笑

# 1章 Python入門
本書ではPythonを用いて実装していくので、１章ではPython基礎文法についてまとめてあります。
あやふやだったやつをメモします。

## Pythonとは
Pythonはシンプルで可読性が高く、初学者におすすめの言語である。また、数値計算や統計処理等ライブラリが豊富であるため機械学習、データサイエンスの分野でもよく用いられる。

### クラス
ユーザが新しいクラスを定義し独自のデータ型を作成する場合、以下のように定義する。

```example.py
class クラス名
    # コンストラクタ
    def __init__(self, 引数, ...)
    # メソッド
    def メソッド名(self, 引数, ...)
```

コンストラクタという初期化を行う特殊なメソッドがある。クラスのインスタンスが作成される際に一度だけ呼ばれる。
以下にclass.pyの実行例を示す。

```class.py
class Man:
    def __init__(self, name):
        self.name = name
        print("Initialized")

    def hello(self):
        print("Hello " + self.name)

m = Man("Lon")
m.hello()
```

```
$ python class.py
Initialized
Hello Lon 
```

class.pyではManというクラスを定義し、mというインスタンス（オブジェクト）を生成する。
コンストラクタによって、mの生成時にself.nameを"Lon"で初期化する。
この変数をインスタンス変数と呼ぶ。

### NumPy
NumPyとは数値計算のためのライブラリで、数学アルゴリズムや配列処理を簡易に行える。
#### NumPy配列作成
NumPyの配列を作成するには、リストを引数に取り、np.array()というメソッドを用いる。
これによりNumPy用の配列である(numpy.ndaray)を作成する。

```
>>> x = np.array([1,2,3])
>>> print(x)
[ 1 2 3 ]
>>> type(x)
<class 'numpy.ndarray'>
```

#### NumPyのN次元配列
NumPyは多次元の配列が作成可能であり、2✕2の2次元配列であれば以下のように作成できる。
行列Aの形状はA.shape,データ型はA.dtypeにて参照できる。
また、数学で用いられる行列のように演算が可能である。

```
>>> a = np.array([[1,2], [3,4]])
>>> print(a)
[[1 2]
 [3 4]]
>>> a.shape
(2, 2)
>>> a.dtype
dtype('int64')
```

#### 要素のアクセス
配列での各要素へのアクセスは以下のように行う。

```
>>> x = np.array([[1, 2], [3, 4], [5, 6]])
>>> print(x)
[[1 2]
 [3 4]
 [5 6]]
>>> x[0]    # 0行目
array([1, 2])
>>> x[0][1] # (0,1)の要素
2
```

for文を使うこともできる。

```
>>> for row in x:
...     print(row)
...
[1 2]
[3 4]
[5 6]
```

また、以下のようなアクセスも可能である。

```
>>> x = x.flatten():      # xを1次元配列へ変換
>>> print(x)
[1 2 3 4 5 6]
>>> x[np.array([0, 2, 4]) # インデックスが0,2,4番目の要素
array([1, 3, 5])
>>> x[x>3]
array([4, 5, 6])
```

### Matplotllib
グラフ描画のためのライブラリで、実験結果やデータの可視化が可能である。

#### 単純なグラフの描画

グラフを描画するためにはmatplotlibのpyplotというモジュールを利用する。
sin関数を描画する例を以下に示す。
配列xの各要素に対しNumPyのsiｎ関数であるnp.sin()を適用し、x,yのデータ列をplt.plotメソッドに与えグラフを描画する。
最後にplt.show()でグラフを表示する。

```sin.py
import numpy as np
import matplotlib.pyplot as plt

# データの作成
# 0から6まで0.1刻みで生成 [0.1, 0.2, 0.3, ..., 5.9]
x = np.arange(0, 6, 0.1)
# 配列xの各要素にsin関数を適用
y = np.sin(x)

# グラフの描画
plt.plot(x, y)
# グラフの表示
plt.show()
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/52002d92-a433-7ff7-cfa8-cb7c83c94b12.png)

#### pyplotの機能
タイトルやx軸ラベルの付与等、他のpyplotの機能の使用例を以下に示す。

```sincos.py
import numpy as np
import matplotlib.pyplot as plt

# データの作成
# 0から6まで0.1刻みで生成
x = np.arange(0, 6, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

# グラフの描画
# ラベル名指定
plt.plot(x, y1, label="sin")
# 破線の指定・ラベル名指定
plt.plot(x, y2, linestyle = "--", label="cos")
# x軸のラベル
plt.xlabel("x")
# y軸のラベル
plt.ylabel("y")
# グラフタイトル
plt.title('sin & cos')
# labelの名称表示
plt.legend()
# グラフ表示
plt.show()
```

![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/54b8978c-50df-e633-b93e-dcd50035e4cb.png)

#### 画像の表示
pyplotには画像表示メソッドimshow()が用意されている。
画像の読み込みは以下のようにmatplotlib.imageモジュールのimread()を利用する。

```imshow.py
import matplotlib.pyplot as plt
from matplotlib.image import imread

# 画像の読み込み
img = imread('lena.png')
plt.imshow(img)

plt.show()
```



![lena.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/37c593da-2be7-5f1a-f71f-49f0d421dcbb.png)


# おわりに
Pythonは研究とか競プロとか、画像処理100本ノックで分からなくなったら調べるって感じの使い方だったので意外と知らなかったとこが多かったですね笑
次はいよいよ2章のパーセプトロンについて読み進めていきたいと思います。