質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

2回答

4988閲覧

決定領域を作成するグラフコードの意味がわかりません

bouyomisan

総合スコア87

Python

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

0グッド

1クリップ

投稿2018/02/20 08:02

編集2018/02/20 08:05

前提・実現したいこと

決定領域を描写するコードがあるのですがこの意味がわかりません。

該当のソースコード

以下のものが該当のコードになります。ここでわからないのは2つの配列を meshgrid で変換しているのと、plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)でグラフに描写しているところです。

こちらのサイトにも等高線を引く時にも meshgridcountourf の二つを使ってグラフを書いていました。
http://ailaby.com/contour/

なぜこれで決定領域が引けるのかがわかりません。

イメージ説明

python

1from matplotlib.colors import ListedColormap 2 3def plot_decision_regions(X, y, classifier, resolution=0.02): 4 # マーカーとカラーマップの準備 5 markers = ('s', 'x', 'o', '^', 'v') 6 colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan') 7 cmap = ListedColormap(colors[:len(np.unique(y))]) 8 9 #決定領域のプロット 10 x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1 11 x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1 12 13 #グリッドポイントの生成 14 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), 15 np.arange(x2_min, x2_max, resolution)) 16  #各特徴量を一次元配列に変換して予測を実行 17 Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) 18 #予想結果を元のグリッドポイントのデータサイズに変換 19 Z = Z.reshape(xx1.shape) 20 # グリッドポイントの等高線のプロット 21 plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap) 22 plt.xlim(xx1.min(), xx1.max()) 23 plt.ylim(xx2.min(), xx2.max()) 24 25 # plot class samples 26 for idx, cl in enumerate(np.unique(y)): 27 plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], 28 alpha=0.8, c=cmap(idx), 29 edgecolor='black', 30 marker=markers[idx], 31 label=cl)

試したこと

meshgrid

meshgrid(X,Y) メソッドはこちらのサイトによるとマス目を作るそうですがよくわかりませんでした。実際に試して見るとこのようになり、第一引数の配列は横一列にして縦に並べるようになり、第二引数の配列は縦一列に並べて横に並べる形になりました。

python

1X = np.array([[1,2], 2 [3,4]]) 3 4 5Y = np.array([[5,6], 6 [7,8]]) 7 8xx1, xx2 = np.meshgrid(X,Y) 9 10print(xx1) 11# 12#[[1 2 3 4] 13# [1 2 3 4] 14# [1 2 3 4] 15# [1 2 3 4]] 16 17print(xx2) 18 19#[[5 5 5 5] 20# [6 6 6 6] 21# [7 7 7 7] 22# [8 8 8 8]]

countour

countour これに関してはなんのことかわかりません。ただ、先ほどのサイトのコードを試してみると1、2引数の配列を元に第三引数のグラフへと代入しているようです。

python

1import numpy as np 2import matplotlib.pyplot as plt 3 4n = 100 5x = np.linspace(-1, 1, n) 6y = np.linspace(-1, 1, n) 7 8X, Y = np.meshgrid(x, y) 9Z = np.sqrt(X**2 + Y**2) 10 11# 12# meshgrid で作った X と Y、そして高さ Z を contour に渡す 13# 14plt.contour(X, Y, Z) 15 16plt.gca().set_aspect('equal') 17plt.show()

イメージ説明

補足情報(FW/ツールのバージョンなど)

python機械学習プログラミング p30
github
https://github.com/rasbt/python-machine-learning-book/blob/master/code/ch02/ch02.ipynb

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

順番に説明します

2変数関数 f(x,y) がある場合、横軸に x, 縦軸に y を取り
f(x,y) の値を等高線図で表したものが countour()、上記の等高線図を色で塗り分けたものがcountourf()となります。

で、上記の countour() or countourf()ですが、データとして2次元データを渡す必要があります。
例えば

f(x,y) = x + y
という関数があったとして
Xがとる値を
x = [1,2,3,4,5,6,7,8,9]
Yがとる値を
y = [10,20,30,40,50]
とした場合、
f(x,y) がとる値を表にすると

-123456789
10111213141516171819
20212223242526272829
30313233343536373839
40414243444546474849
50515253545556575859

となりますので、countour() or countourf()のデータとしては上記の表同様の2次元データを渡すことにより、f(x,y)の値をもとに等高線図を描画することができます。

Python

1data = [[11,12,13,14,15,16,17,18,19], 2 [21,22,23,24,25,26,27,28,29], 3 [31,32,33,34,35,36,37,38,39], 4 [41,42,43,44,45,46,47,48,49], 5 [51,52,53,54,55,56,57,58,59]] 6plt.contourf(data)

ですが実際は上記のように計算結果を常にハードコーディングするわけにはいきませんので、配列サイズに合わせて X値だけ埋めたもの

Python

1X = np.array([[1,2,3,4,5,6,7,8,9], 2 [1,2,3,4,5,6,7,8,9], 3 [1,2,3,4,5,6,7,8,9], 4 [1,2,3,4,5,6,7,8,9], 5 [1,2,3,4,5,6,7,8,9]])

と Y値だけ埋めたもの

Y = np.array([[10,10,10,10,10,10,10,10,10], [20,20,20,20,20,20,20,20,20], [30,30,30,30,30,30,30,30,30], [40,40,40,40,40,40,40,40,40], [50,50,50,50,50,50,50,50,50]])

を予め準備しておき f(x,y) の値を

Python

1data = X + Y

のように実際に計算を行うことで、データを作成するのが一般的となります。

・・と、ここまで理解できましたら、あとは簡単で、

一番最初に定義した

Python

1x = [1,2,3,4,5,6,7,8,9] 2y = [10,20,30,40,50]

の2つの配列から上記で計算に使用する

Python

1X = np.array([[1,2,3,4,5,6,7,8,9], 2 [1,2,3,4,5,6,7,8,9], 3 [1,2,3,4,5,6,7,8,9], 4 [1,2,3,4,5,6,7,8,9], 5 [1,2,3,4,5,6,7,8,9]]) 6Y = np.array([[10,10,10,10,10,10,10,10,10], 7 [20,20,20,20,20,20,20,20,20], 8 [30,30,30,30,30,30,30,30,30], 9 [40,40,40,40,40,40,40,40,40], 10 [50,50,50,50,50,50,50,50,50]])

のような2次元配列化したX,Yを作成する為の関数がmeshgrid()ということになります。
meshgrid()を使うと上記のコードは

Python

1import numpy as np 2import matplotlib.pyplot as plt 3 4x = [1,2,3,4,5,6,7,8,9] 5y = [10,20,30,40,50] 6X,Y = np.meshgrid(x,y) 7data = X + Y 8plt.contourf(X, Y, data) 9plt.show()

となります。

最後になりますが、分類結果の色分けは単にZ(=f(x,y))の値によって countourf()にて色分けしているだけとなります。

投稿2018/02/24 09:43

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

与えられた領域からグリッド状にデータ点をサンプルし、全ての点に対して識別器で分類させています。Zが分類結果なのですが、それに基づいてcontourfで色を塗り分けているだけです。

あまり気にせずに進んだほうがいいところだと思いますよ。

投稿2018/02/20 10:46

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問