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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

1076閲覧

等位線をプロットする際に行うmeshgridとravelメソッドについて

Logarithm

総合スコア80

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2021/12/07 08:47

以下のコードで決定木の境界線をプロットしようとしているのですが、なぜ等位線を描くときにmeshgrid
を行うのか、なぜX_newの定義の際にx1.ravel()としているのかが分かりません。
x1sを使っても一様境界線はプロットしてくれるのに何故なんでしょうか?

import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap import numpy as np from sklearn import tree from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier """6.1 決定木の訓練と可視化""" iris = load_iris() X = iris.data[:, 2:] y = iris.target tree_clf = DecisionTreeClassifier(max_depth=2) tree_clf.fit(X, y) #決定木の境界線をプロット def plot_decision_boundary(clf, X, y, axes = [0, 7.5, 0, 3], iris=True, legend=False, plot_training=True): #ここから分かりません x1s = np.linspace(axes[0], axes[1], 100) x2s = np.linspace(axes[2], axes[3], 100) x1, x2 = np.meshgrid(x1s, x2s) X_new = np.c_[x1.ravel(), x2.ravel()] y_pred = clf.predict(X_new).reshape(x1.shape) custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0']) plt.contourf(x1, x2, y_pred, cmap=custom_cmap, alpha=0.2) #ここまで if not iris: custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50']) plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8) if plot_training: plt.plot(X[:, 0][y==0], X[:, 1][y==0], 'yo', label='Iris setosa') plt.plot(X[:, 0][y==1], X[:, 1][y==1], 'bs', label='Iris versicolor') plt.plot(X[:, 0][y==2], X[:, 1][y==2], 'g^', label='Iris virginica') plt.axis(axes) if iris: plt.xlabel('Petal length', fontsize=18) plt.ylabel('Petal width', fontsize=18) else: plt.xlabel(r'$x_1$', fontsize=18) plt.ylabel(r'$x_2$', fontsize=18) if legend: plt.legend(fontsize=14) plt.figure(figsize=(8, 4)) plot_decision_boundary(tree_clf, X, y) plt.show()

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

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

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

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

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

guest

回答1

0

ベストアンサー

なぜ等位線を描くときにmeshgridを行うのか

2次関数 f(x, y) の等高線を描画するには、各 (x, y) での高さ関数の値 f(x, y) を計算する必要があります。なので、x1, x2 = np.meshgrid(x1s, x2s) である範囲の点 (x, y) の組み合わせを作成しています。

なぜX_newの定義の際にx1.ravel()としているのかが分かりません

X, Y = np.meshgrid() の返り値 XY はそれぞれ2次元配列なので、1次元配列にした上で結合することで、(N, 2) の配列にしています。clf.predict() は (サンプル数, 特徴量の次元数) という2次元配列を受け取るため、そのように形状を変更しています。

import numpy as np X, Y = np.meshgrid(np.arange(4), np.arange(4)) print(X) # [[0 1 2 3] # [0 1 2 3] # [0 1 2 3] # [0 1 2 3]] print(Y) # [[0 0 0 0] # [1 1 1 1] # [2 2 2 2] # [3 3 3 3]] print(X.ravel()) # [0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3] print(Y.ravel()) # [0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3] print(np.c_[X.ravel(), Y.ravel()]) # [[0 0] # [1 0] # [2 0] # [3 0] # [0 1] # [1 1] # [2 1] # [3 1] # [0 2] # [1 2] # [2 2] # [3 2] # [0 3] # [1 3] # [2 3] # [3 3]]

投稿2021/12/07 08:58

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問