サンプルプログラムをそのまま動かしたけれど、何してるか理解しいないと進歩ないね・・・
よき心がけですね。
前回、k最近傍法の境界線がどうなっているかを確認するプログラムを作成しました。

このなかで、いくつかscikit-learnのサンプルプログラムをそのまま利用している部分がありました。
今回は、make_meshgridという関数を読み解くため、勉強をしましたので、その内容をつづりたいと思います。
↓今回のmake_meshgrid関数
def make_meshgrid(x, y, h=.02):
x_min, x_max = x.min() - 1, x.max() + 1
y_min, y_max = y.min() - 1, y.max() + 1
#格子点を作成する
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
return xx, yy
こんな人の役に立つかも
・numpyのarange関数について知りたい人
・numpyのmeshgrid関数について知りたい人
・scikit-learnで機械学習プログラミングを勉強している人
make_meshgridでやっていること
xに「sepal length」のデータ、yに「sepal width」のデータを与えます。hは固定値の0.02としています。
x.minは、xの中の最小値、x.maxはxの中の最大値を出力してくれます。xの最小値から1を引いた数値をx_minという変数にいれ、xの最大値に1を足した値をx_maxという変数に入れています。
x_minとx_maxは、グラフのX軸の最小値と最大値となります。xには、「sepal length」のデータが入ってきますので、「sepal length」のすべてのデータが余裕をもって入るように-1、+1となっています。
y_min、y_maxは「sepal width」のデータ(グラフのY軸)としてX軸と同じことをしています。

「#格子点を作成する」のところ
・np.arange(x_min, x_max, h)

x_minの値~x_maxの値までの数値で、hの間隔のデータの配列を作成します。上の図の緑糸の
y_min~y_maxも同様に、arangeで[1.00 , 1.02, 1.04 ・・・ , 5.36, 5.38]という配列を作成します。
X軸の数値:[3.30, 3.32, 3.34, ・・・ , 8.88]
Y軸の数値:[1.00 , 1.02, 1.04 ・・・ , 5.38]
・np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))
meshgridに、先ほど作成したX軸の数値とY軸の数値を与えます。
meshgridには、配列を2つ与えると、格子点というものを作成できます。何のことかわかりにくいですね・・・

実際に、xxとyyをprintするとわかるのですが、上の図のように、X軸とY軸の座標を作成した時のそれぞれ0.02間隔の座標を表現したX軸とY軸の値のデータ列になります。
このように、xxとyyを作成することで、配列のインデックスで座標にアクセスすることができるようになります。
xxの「1行目1番」というインデックスのデータと、yyの「1行目1番」というインデックスのデータを組み合わせることで(3.38, 1.00)という座標のデータを得ることができます。

このように、gridのようにしてX軸とY軸のデータを配列にすることで、インデックスで格子上(grid)に並べられたデータを0.02の細かさで呼び出せるようになりました。
インデックスでデータを管理することで、ループなどでまわしたり、プログラムでも扱いやすい座標データの形式になったということですね。
言葉だと、イメージしづらかった・・・
まとめ:なかなかイメージしづらい
numpyのデータ変換などは、直感的にイメージしづらいですね^^;
おそらく次にmeshgridとか出てきても、また調べたり、イメージをしたりしないと理解できる自信がありません・・・これらを直感的に扱ってデータ分析をしている人たちはすごいなと思いました。
今回は、境界線を引くためのデータ作成という位置づけのプログラムを読み解きました。次回は、このグリッドデータを利用して、境界線を描いている関数、plot_contoursを読み解いていきたいです。
次の記事はこちらです。
