今回は、境界線を描いているplot contoursをみてみるよ。
countoursは英語で輪郭っていう意味だね。
前回は、make_meshgridという関数の中身で何をしているのか、勉強していました。今回は、plot_contoursという実際にグラフに境界線を描いている部分を勉強していきたいと思います。
def plot_contours(ax, clf, xx, yy, **params):
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
out = ax.contourf(xx, yy, Z, **params)
return out
前回の記事は、こちらを参照ください。
こんな人の役に立つかも
・numpyのravel関数について知りたい人
・numpyのc_関数について知りたい人
・scikit-learnで機械学習プログラミングを勉強している人
plot_contoursでやっていること
まず、predictに与えられている「c_」というものと、「ravel」というものを理解する必要がありそうです。
ravel
まずは、一番最初に実行されるravelについてですね。
ravelは、numpyのデータの形を変化させる機能です。
今回は、ravelによってxxの値とyyの値を変化させていますね。ちなみに、xxとyyは前回make_meshgridで作成したものです。格子点と呼ばれる形のデータに変更したx軸とY軸の値が2次元配列で入っている変数です。
xxには、座標のグリッドのように、視覚的にわかりやすい2次元配列の形で格子点のX軸のデータが入っています。xxとyyは、同じインデックス同士の数値を合わせると、座標の点が表現できるのでした。
まずはravelで、xxとyyを1次元配列の形に変更します。
1次元配列に変換する方法には、ravel以外にflattenという同様の機能があるのですが、「返す値」が違ってきます。
flattenはどうやら、元のデータと、変化したデータの両方を結果として「返して」くれるみたいです。今回は、変化した結果のみが欲しいので、ravelを利用します。
c_
ravelで1次元配列を作成していることはわかりました。
次に、その1次元配列をc_という機能が利用しています。
np.c_[xx.ravel(), yy.ravel()]
c_は、配列をくっつける機能のようです。1次元配列同士をくっつけると、縦方向になって、2次元配列にしてくれます。次のようなイメージになります。
縦にして、くっつけている、という感じですね。
ここで気づくのですが、出来上がった2次元配列の順番は、格子点をX軸方向→Y軸方向になぞっていく順番になります。2次元配列をなぞると、そのままXとYの点のペアが得られることになります。
predictする
先ほど作成した、「格子点の座標を表すデータ」をscikit-learn機械学習アルゴリズムのpredictに入れます。
前回は、k最近傍法でやりました。この機械学習アルゴリズムは、clfというところに入れているので、clf.predictとすることでできます。最終的に、Zという変数に0.02刻みのXY座標を左から右、下から上へと順番に予測させています。すべての座標平面を予測させることで、その座標がどの答えかを出しているわけですね。
Zには、先ほどの座標の順番で、その座標がどの分類に属しているのかという答えのデータを出してくれます。
この一連の流れは、
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
1行で書かれています。
正直、1行にいろいろつまりすぎていて、かなり合言葉的な感じ・・・
次にreshapeです。
Z = Z.reshape(xx.shape)
Zを出した次には、reshapeという機能でZの形をまた変更しています。
これは、視覚的に格子点に対する答えの位置と対応しているように変換しています。
もともと座標の格子点のデータの形(格子点の縦と横の個数のこと)は、xx(またはyyどちらでもよい)の形でした。
この形に合わせるということで、Zの1次元配列データを2次元配列のデータに変更しています。
contourfで輪郭を描く
contourfは、matplotlibの機能で、格子点と格子点に対応する数値から高等線を描く機能らしいです。
同じ値の格子点を結ぶことで、気圧や土地の高低を表現するときに利用される図ですね。
すでに、格子点のデータと、その格子点の数値データはそろっているね。
すでに今までのデータ作成で、contourfに渡すべきデータはそろっています。
contourfの「**params」には、「cmap=plt.cm.coolwarm, alpha=0.8」が与えられますが、これは、グラフの色などを指定するものなので、今回はこの設定にしていきます。
まとめ:少ない行数でかなり複雑なことができる
今回見たように、配列の操作など、少ない行数でかなり複雑なデータ操作ができますので、ひとつづつ追っていかないと、サンプルプログラムでもどこでどのようになったのかが、全く分からなくなります^^;
ひとつづつですが、numpyなどの機能を覚えて、魔法のように使いこなせるようになっていきたいです。