はじめに
Matplotlibで簡単なグラフ描画を試してみたいと思います。機械学習で学習の進み具合をプロットするためにも、プロットの簡単な方法をマスターしておきたいと思います。
実験
今回、0と1が4:6で混ざっている抽選箱があったとして、ここからN回取り出したとき、取り出した値の平均値はどこに収束するかを観察したいと思います。なお、期待値\(E\)は0.6です。 \[E=\frac{0\times4+1\times6}{4+6}=0.6\]
import random
#import matplotlib
#matplotlib.use('Agg')
import matplotlib.pyplot as plt
p = 0.6
t = 1000
def get_data():
if random.random() < p:
return 1
else:
return 0
def get_averages():
averages = []
trials = []
for i in range(t):
trials.append(get_data())
averages.append(sum(trials) / len(trials))
return averages
fig, (axes) = plt.subplots(1, 1)
data_x = list(range(t))
axes.plot(data_x, get_averages(), 'r')
axes.plot(data_x, get_averages(), 'y')
axes.plot(data_x, get_averages(), 'g')
axes.plot(data_x, get_averages(), 'b')
axes.set_title('Convergence to the average')
axes.set_xlabel('n-times trial')
axes.set_ylabel('average')
axes.set_ylim([0., 1.])
axes.legend(['1st', '2nd', '3rd', '4th'])
axes.grid(True)
#plt.savefig('convergence-to-the-average.png')
plt.show()
このプログラムはGUI環境で実行することを想定しています。プログラムを実行すると、プロット結果が別ウィンドウで表示されます。GUI環境がない環境で実行するときは3か所あるコメントアウトを外して、最後の plt.show()
をコメントアウトしてください。別ウィンドウを開く代わりにPNGファイルに保存します。 関数 get_data
で0か1かを4:6の割合で取り出せます。関数 get_averages
では、値を1つ取り出すたびに、取り出した結果(trials)の平均(averages)を計算していきます。 以降、Matplotlibによるプロット処理になります。fig, axes を取得して、axes にプロットするデータ、タイトル、凡例などを追加していきます。今回、4回分のデータを1つのグラフにプロットしてみました。結果、下記の様なグラフが表示されます。回数を増やすにつれ、0.6に収束していく様子が確認できます。

おわりに
X軸用のデータリストとY軸用のデータリストがあれば簡単にプロットできます。今回はグラフの種類としては折れ線グラフ(plot)を使用しましたが、他にも分散図(scatter)やヒストグラム(hist)、棒グラフ(bar)といったグラフも描画できます。さらに、オシロスコープのような、時間とともに変化するようなグラフをアニメーションとして出力することもできます。 分析、評価などを行う上で、積極的に使用していきたいですね!