質問編集履歴

1 tuika

bouyomisan

bouyomisan score 79

2018/02/20 17:05  投稿

決定領域を作成するグラフコードの意味がわかりません
### 前提・実現したいこと
決定領域を描写するコードがあるのですがこの意味がわかりません。
### 該当のソースコード
以下のものが該当のコードになります。ここでわからないのは2つの配列を `meshgrid` で変換しているのと、`plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)`でグラフに描写しているところです。
こちらのサイトにも等高線を引く時にも `meshgrid` と `countourf` の二つを使ってグラフを書いていました。
http://ailaby.com/contour/
なぜこれで決定領域が引けるのかがわかりません。
![イメージ説明](0b6e78cf47ff883d024a0cd0dabfae3c.png)
```python
from matplotlib.colors import ListedColormap
def plot_decision_regions(X, y, classifier, resolution=0.02):
   # マーカーとカラーマップの準備
   markers = ('s', 'x', 'o', '^', 'v')
   colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
   cmap = ListedColormap(colors[:len(np.unique(y))])
   #決定領域のプロット
   x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1
   x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1
   #グリッドポイントの生成
   xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution),
                          np.arange(x2_min, x2_max, resolution))
  #各特徴量を一次元配列に変換して予測を実行
   Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
   #予想結果を元のグリッドポイントのデータサイズに変換
   Z = Z.reshape(xx1.shape)
   # グリッドポイントの等高線のプロット
   plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
   plt.xlim(xx1.min(), xx1.max())
   plt.ylim(xx2.min(), xx2.max())
   # plot class samples
   for idx, cl in enumerate(np.unique(y)):
       plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1],
                   alpha=0.8, c=cmap(idx),
                   edgecolor='black',
                   marker=markers[idx],
                   label=cl)
```
# 試したこと
#### meshgrid
`meshgrid(X,Y)` メソッドは[こちらのサイト](http://ailaby.com/contour/)によるとマス目を作るそうですがよくわかりませんでした。実際に試して見るとこのようになり、第一引数の配列は横一列にして縦に並べるようになり、第二引数の配列は縦一列に並べて横に並べる形になりました。
```python
X = np.array([[1,2],
             [3,4]])
Y = np.array([[5,6],
             [7,8]])
xx1, xx2 = np.meshgrid(X,Y)
print(xx1)
#
#[[1 2 3 4]
# [1 2 3 4]
# [1 2 3 4]
# [1 2 3 4]]
print(xx2)
#[[5 5 5 5]
# [6 6 6 6]
# [7 7 7 7]
# [8 8 8 8]]
```
#### countour
`countour` これに関してはなんのことかわかりません。ただ、[先ほどのサイト](http://ailaby.com/contour/)のコードを試してみると1、2引数の配列を元に第三引数のグラフへと代入しているようです。
```python
import numpy as np
import matplotlib.pyplot as plt
n = 100
x = np.linspace(-1, 1, n)
y = np.linspace(-1, 1, n)
X, Y = np.meshgrid(x, y)
Z = np.sqrt(X**2 + Y**2)
#
# meshgrid で作った X と Y、そして高さ Z を contour に渡す
#
plt.contour(X, Y, Z)
plt.gca().set_aspect('equal')
plt.show()
```
![イメージ説明](248c5aeca5201d451dbbe95881437ac4.png)
### 補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
python機械学習プログラミング p30
github
https://github.com/rasbt/python-machine-learning-book/blob/master/code/ch02/ch02.ipynb
  • Python

    12334 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る