ディープラーニングの理論と実装を学ぶためにpython環境を構築する

最近は機械学習の勉強に向け、ちょこっとpythonを触り始めました。
今回はCentOS 7でのpython環境の構築について整理します。

# 環境
- CentOS 7.2
- python 3.5.2
- VirtualBox 5.1.8

# 1. IUS Community Project のリポジトリを追加する
python 3系はCentOS 7のリポジトリでは提供されていないので、別途リポジトリを登録する必要があります。

```
# yum install -y https://centos7.iuscommunity.org/ius-release.rpm
```

ただ普段は使わないリポジトリなので、無効に変更して使用したい場合のみ使用するようにします。

```
# vim /etc/yum.repos.d/ius.repo
[ius]
enabled=1
↓
enabled=0
```

# 2. 最新のpythonをインストールする

iusで提供されている最新は3.5.2でしたので、今回はそれを使用します。

```
# yum clean all
# yum install --enablerepo=ius -y python35u python35u-libs python35u-devel python35u-pip
```

ただ、このままではデフォルトで入っているpythonにパスが向かっている状態なので、2系を指しています。

```
$ python --version
Python 2.7.5
```

なぜこのようになっているかというと、以下のようにエイリアスが貼られているからです。

```
# ls -l /bin/python                                                            
lrwxrwxrwx 1 root root 7 12月 17 17:56 /bin/python -> python2
# ls -l /bin/python2
lrwxrwxrwx 1 root root 9 12月 17 17:56 /bin/python2 -> python2.7
# ls -l /bin/python3*                                                          
-rwxr-xr-x 2 root root 11304  6月 28  2016 /bin/python3.5
lrwxrwxrwx 1 root root    26  1月  1 20:02 /bin/python3.5-config -> /usr/bin/python3.5m-config
-rwxr-xr-x 2 root root 11304  6月 28  2016 /bin/python3.5m
-rwxr-xr-x 1 root root   173  6月 28  2016 /bin/python3.5m-config
-rwxr-xr-x 1 root root  3398  6月 28  2016 /bin/python3.5m-x86_64-config
```

---
ここで注意ですが、pythonを3系にシンボリックリンクの貼り直しはNGです。
貼り替えてしまうと、python2系を使用している諸々が動かなくなってしまいます。

例えば、yumが使えなくなったります。こんなエラーとか出ます。

```
File "/usr/bin/yum", line 30
    except KeyboardInterrupt, e:
                            ^
```

---

なので、3系を使用する場合はとりあえず以下のようにして使ってみます。
（普通はどう使うのが良いのか？pyenvとか使ったほうが良いのかな？）

```
# ln -s /bin/python3.5 /bin/python3
# python3 --version
Python 3.5.2
```

pipも2.7にパスがとおっているので。

```
# ln -s /bin/pip3.5 /bin/pip3
# pip3 --version
pip 9.0.1 from /usr/lib/python3.5/site-packages (python 3.5)
```

# 3. 外部ライブラリ NumPyとMatplotlibをインストールする
今回は勉強のために、多次元配列を提供する「NumPy」とグラフの描画やデータの可視化できる「Matplotlib」を使用します。

Matplotlibをimportするためには以下のパッケージも必要なのでインストールします。

```
# yum install --enablerepo=ius -y python35u-tkinter
```

続いて、NumPyとMatplotlibをインストールします。

```
# pip3 install numpy matplotlib
```

準備はこれで完了しました。
あとはこういうスクリプトを書いて動かせばグラフが出力できます。

```sample-graph.py
 1 #!/bin/python3
 2 import numpy as np
 3 import matplotlib.pyplot as plt
 4 
 5 x = np.arange(0,6,0.1)
 6 y = np.sin(x)
 7 
 8 plt.plot(x, y)
 9 plt.show()
```

![sample-graph](https://d17oy1vhnax1f7.cloudfront.net/items/2G2U1G2L3V0T1y3z0H3d/sample-show.png "graph")

# GUI環境でない場合の対処
SSHでリモートからの接続等GUI環境でない場合、上記のスクリプトのplt.plot(x, y)部分の実行で以下のエラーが出ると思います。

```
_tkinter.TclError: no display name and no $DISPLAY environment variable
```

以下の対処が考えれます。

## 対処1：グラフをファイルで出力する

まずはpythonの設定を変更します。

```/usr/lib64/python3.5/site-packages/matplotlib/mpl-data/matplotlibrc
 38 backend      : tkagg
　↓
 38 #backend      : tkagg
 39 backend      : agg
```

上記の修正と合わせて、スクリプト「sample-graph.py」の最後の1行を以下のように修正します。

```
 8 plt.show()
　↓
 8 plt.savefig('sample-graph.png')
```

これで指定したグラフをファイルに出力することができます。


## 対処2：GUIで操作する

sshでリモートから接続している場合は、直接マシンを操作するか。
マシンがCUIになっていれば、以下のコマンドでGUIに変更して操作するか。あとは良しなに！

```
# systemctl isolate graphical.target
```

# さいごに
これで勉強するのに必要なpythonの環境構築はできたと思います。
（環境の準備で意外と時間を食ってしまった。。。）