実現したいこと
SVMの識別境界面をdecision_functionの出力値を使って3次元空間に描画したい。
まずはlinearカーネルで正しく面ができることを確認した後、RBFカーネルでも曲面を作りたい。
前提
直接、識別関数の式を使って平面自体は描画することができた。
ただ、decision_functionの出力値が0になる位置=境界面となることを利用して
描画を実行すると平面はできあがるが、位置がデータの分布に対してズレてしまう。
(decision_functionの出力値を使う理由はRBFで曲面を作りたいため。)
該当のソースコード
Python
1from sklearn.datasets import load_iris 2import matplotlib.pyplot as plt 3import numpy as np 4from sklearn.preprocessing import StandardScaler 5from sklearn.svm import SVC 6 7# irisデータセットの読み込み 8iris = load_iris() 9 10# 特徴量とクラスラベルの取得 11X = iris.data 12y = iris.target 13 14# 3つの特徴量を使用 15X = X[:, :3] 16# クラス0と1のみにするために2を1に変換 17y[y == 2] = 1 18 19# データのスケーリング 20scaler = StandardScaler() 21X = scaler.fit_transform(X) 22 23# SVMのRBFカーネルによる分類器の学習 24clf = SVC(kernel='linear', gamma=1, C=1) 25clf.fit(X, y) 26 27# 3Dグラフの作成 28fig = plt.figure(figsize=(8, 8)) 29ax = fig.add_subplot(111, projection='3d') 30 31# データのプロット 32ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap='bwr') 33 34# 決定境界の作成 35xx, yy = np.meshgrid(np.linspace(X[:, 0].min(), X[:, 0].max(), 50), 36 np.linspace(X[:, 1].min(), X[:, 1].max(), 50)) 37zz = - clf.decision_function(np.c_[xx.ravel(), yy.ravel(), np.zeros(xx.shape).ravel()]) 38zz = zz.reshape(xx.shape) 39 40# 決定境界のプロット 41ax.plot_surface(xx, yy, zz, alpha=0.5) 42 43ax.set_xlabel('X Label') 44ax.set_ylabel('Y Label') 45ax.set_zlabel('Z Label') 46 47plt.show()
試したこと
np.meshgridの領域を変更したが変化なし。
clf.decision_functionの符号を反転したが位置が変わることはなかった。
補足情報(FW/ツールのバージョンなど)
Python3.9
PyCharm 2022.2 (Community Edition)

回答1件
あなたの回答
tips
プレビュー