PythonでやるML Cycle1: Pythonに慣れる

Pythonのインストールから実際にコードを書いてみるところまで。

# ゴール
* Pythonの開発環境を整備する。
* Pythonのいくつかのライブラリを使ってちょっと数学的な事をコードで表現してみる。

# Pythonの開発環境の構築して`Hello World!`を出力する
## 説明

以下からPython(**version 3.6.6**)とIDEのPyCharmをインストールします。

* Python: https://www.python.org/downloads/
* PyCharm: https://www.jetbrains.com/pycharm/

注意として、

* Pythonは2018/09現在最新の3.7.0をインストール**しないよう**注意。このバージョンではtensorflowがまだ対応していません。
* PyCharmはProfessional版とCommunity版の二つがあります。どちらでもよいですが、Professional版はライセンス料がかかるので、まずは無料で、という人はCommunity版を選択しましょう。

PythonはJavaと比較してIDEがなくても書いてもいいかなという気持ちになりますが、やはりIDEを使いましょう。「インデントがなかった」といったしょーもないミスに時間を割きたくありません。

尚IDEであればPyCharmでなくてもOKです。Visual StudioでもPythonが書けるらしいので、例えばそれに慣れているならばそちらでも構いません。ただし以降はPyCharmを使っていることを前提に話を進めるため、VSを使用している場合は適宜補ってください。

上二つをインストールできたら、

* [PyCharmでpythonを動かす(Windows)](https://qiita.com/syunsuke-aka/items/19f2e8f33be26e04437d)
* [PyCharm事始め](https://qiita.com/hrs_sano645/items/63d3392542e265f9571e)

を見て初期設定を行います。※[PyCharmでpythonを動かす(Windows)](https://qiita.com/syunsuke-aka/items/19f2e8f33be26e04437d)の`print "Hello World!"`はPython2のものなので、今回の環境(Python3)では動きませんのでご注意ください。

初期設定ができたらまずプロジェクトを作ります。

* [ステップ 1.最初のPythonプロジェクトの作成と実行](https://pleiades.io/help/pycharm/creating-and-running-your-first-python-project.html)

を参照してください。

手っ取り早くやりたいかたは

* [Intellij IDEAでPythonでHelloWorld!!] (https://syobochim.hatenablog.com/entry/2013/08/04/021452)

を参照してください。

最後に

* [PyCharmの使い方](https://pleiades.io/help/pycharm/meet-pycharm.html )

を一通り眺めてください。

## 確認
プロジェクトを作成し、以下のコードを書いて、実行する。

```python
print("Hello World!")
```

出力

```
Hello World!
```

# Pythonの基本を知る

## 説明

まずデバッグによく使う対話型の実行環境**Python Console**を使ってみましょう。

PyCharmの左下にちっちゃく「Python Console」とあると思います。それをクリックするか、あるいは上段ツールバーの「Tools」からやはり「Python Console」を探してクリックします。すると以下のようなプロンプトが現れます。

```
PyDev console: starting.
Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32

>>>
```

ここにコードを書いてEnterを押下すると、すぐに結果が現れます。

```
>>> print("Hello World!")
Hello World!
```

これから頻繁に使うので覚えておきましょう。

Pythonの基本文法ですが、ここでは説明しません。代わりに [Progate](https://prog-8.com/languages/python) のPythonに関するすべてのコースを受講してください。以下このコースの内容程度の理解を前提とします。

またPythonの文法に関することは、今後もあまり説明しないつもりです。辛いので。適宜Web上の記事や書籍を参照してください。必要な案内は可能な限りします。

完全なPython3(.6)の仕様は https://docs.python.org/3.6/ にあります。

# 機械学習でよく使われるライブラリを使ってみる

## 説明

まず`numpy`, `matplotlib`, `scipy`, `pandas` のモジュールをインストールします。PyCharm(あるいはIntelliJ)でモジュールをインストールする方法は

* [PyCharmによるパッケージの追加方法](https://qiita.com/yamaAtsu/items/34e2a04408695365d586)

を参照してください。

モジュールをインストールできたら、以下の記事から何ができるかを確認してください。

* `numpy`: 特に行列に関する演算を簡単に高速にできるモジュール
    * [10分で学ぶNumPy速習チュートリアル](https://deepage.net/features/numpy-numpy.html)
    * http://www.numpy.org/
        * 特に [Quickstart tutorial](https://docs.scipy.org/doc/numpy/user/quickstart.html) で使い方はおよそわかります。
* `matplotlib`: グラフなどの描画をしてくれるモジュール
    * [matplotlib入門](http://bicycle1885.hatenablog.com/entry/2014/02/14/023734)
    * [matplotlib.org/gallery](https://matplotlib.org/gallery.html)
    * [Pythonでmatplotlibの描画がうまく機能しない場合の対処](https://qiita.com/yoshizaki_kkgk/items/bcb45e3bc936ec49ef00)
        * 以下でもうまくいくそうです。

```python
import matplotlib matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
```
* `scipy`: 数値計算のライブラリ。`numpy` $\subset$ `scipy` という関係らしい。
    * SciPy: https://docs.scipy.org/doc/scipy/reference/index.html
    * [SciPy Tutorial](https://docs.scipy.org/doc/scipy/reference/tutorial/index.html)
    * [NumPy vs. SciPy vs. other packages](https://www.scipy.org/scipylib/faq.html#numpy-vs-scipy-vs-other-packages)
* `pandas`: データを直観的に扱う事に長けたライブラリ。これを使ってデータ抽出や整形、出力を行う。
    * pandas: http://pandas.pydata.org/pandas-docs/stable/
    * [pandasの基本操作](https://qiita.com/hi34/items/43c366dea18b46faf49d)
    * [pandasでcsv/tsvファイル読み込み（read_csv, read_table）](https://note.nkmk.me/python-pandas-read-csv-tsv/)
    * pandas to_csv: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html
    * pandas read_csv: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html#pandas.read_csv


## 確認

* 1. 以下の連立方程式を解く関数を作る。入力は$a$, $b$, $c$, $d$, それと $i$, $j$. 

```math
\left(
\begin{matrix}
a &b \\
c &d \\
\end{matrix}
\right)
\left(
\begin{matrix}
x_1 \\
x_2
\end{matrix}
\right)
=
\left(
\begin{matrix}
i \\
j
\end{matrix}
\right)
```

出力イメージ

```
>>> solve_2dim_equations(a=3, b=0, c=0, d=2, i=12, j=26)
array([ 4., 13.])
```

* 2. 正規分布の密度関数のグラフを出力する。$\mu$と$\sigma$、定義域は適宜定数を当てはめてください。

```math
f(x) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left({- \frac{(x - \mu)^2}{2 {\sigma}^2}}\right).
```

* 3. 正規分布 $N(\mu = 172.14, \sigma^2 = 5.57^2)$ に従うサンプルデータを1,000個抽出して、それをCSVに出力してください。ちなみにこの分布は日本人男性30歳のもの。

出力イメージ

```
0,166.99038183853008
1,166.51281214908536
2,181.5585432128473
3,162.77441753222197
4,168.48261956594868
5,172.88492726845533
6,170.89622660999441
...
```

* 4. 上で出力したCSVを読み込んで、散布図として描写してください。

イメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/285861/4e2a28dd-4132-2c46-4d22-c994c58f8259.png)



# 実践問題

## 1. ★サンプルデータを作る

Cycle2ではPRML(上)の序論、あるいは第3章にある線形回帰モデルを扱います。ここではそれに必要なサンプルデータを作ります。

$x \in$ { $ 0, \, 0.01, \, 0.02, \, \dots, \, 0.99 $ } の100個の入力データに対して、正規分布$N(\sin(2 \pi x), 0.3^2)$ に従うサンプルデータをそれぞれ抽出してください。それを以下二つの出力で表現してください。ただし、CSVに出力したデータは$x$を軸にランダムに並び替えてください:

* CSVで出力
* 散布図で出力


イメージ

CSV

```
0.9400000000000001,-0.878558954149004
0.14,0.3878279859542065
0.8200000000000001,-1.442692345490618
0.37,0.5459918361055303
0.56,-0.8708510248577344
0.33,0.6818388375590906
...
```

## 2. カオス理論入門

バタフライエフェクトという言葉をご存知でしょうか。バタフライエフェクトとは、「日本で蝶が羽ばたくと、アメリカでハリケーンが起こる」といった、ほんの小さな違いがのちの結果に大きな影響を与えること表す標語のようなものです。[風が吹けば桶屋が儲かる](http://ja.uncyclopedia.info/wiki/%E9%A2%A8%E3%81%8C%E5%90%B9%E3%81%91%E3%81%B0%E6%A1%B6%E5%B1%8B%E3%81%8C%E5%84%B2%E3%81%8B%E3%82%8B)ですね。

実は数学の[力学系理論](https://ja.wikipedia.org/wiki/%E5%8A%9B%E5%AD%A6%E7%B3%BB)という分野では、この現象について深く研究されています。

その中から、ロジスティック方程式と呼ばれる、生物の個体数の増減に関するモデルを使って、この現象を体験してみます。

ある地域に数百匹のウサギが生息しています。毎月ウサギの個体数を計測していたある調査員は、以下のことに気づきました:

* 餌(植物)場の広さと餌の量から、その地域に生息できるウサギの個体数の上限は決まっている。
* 個体数が上限よりも少ないときは、その地域に生えている餌が有り余っているので、個体数は月単位で増加する。
* 一方、個体数が上限よりも多いときは、その地域の餌を食べつくしてしまって餓死するウサギが出てくるので、個体数は月単位で減少する。
* さらにこの地域のウサギの天敵、つまり蛇やウサギを食用とする原住民が、毎月一定の割合でウサギを殺してしまうので、その分個体数は減少していく。

この現象を調査員が生態学者に伝えると、その生態学者は以下のような数学的モデルを立てました:

```math
f(n + 1) - f(n) = f(n)(1 - f(n)) -h, \\
```
ここで$f(n)$は、$n$か月目に観測したときの、決まっている個体数の上限と実際に生息しているウサギの個体数の割合、$h$は天敵がウサギを殺す数と上限の割合を表しています。

$f(n) < 1$のときは餌が有り余っていて、$f(n) > 1$のときは餌が足りない状態です。$f(n)$は必ず0以上です。

$h = 1$のならば、ウサギの天敵がその地域で生息できるウサギの個体数の上限を1か月で殺してしまうことを意味しています。$h$が0に近いほど、天敵が1か月で殺すウサギの個体数が少ないことを意味しています。$h$もまた必ず0以上です。

以上のような条件で、$h$の値を0から1の間で色々と変えたときの、10年後(=120か月後)のウサギの個体数の割合$f(120)$をシミュレーションしてください。尚、初期値は$f(0) = 1$とします。