質問
書籍でカーネル法を用いたサポートベクタマシンを学んでいたときに出てきたコードです。
XXとYYとZZのそれぞれの50個に分割した座標を結んで三次元空間に平面を描画しているというところまでは読み取れたのですが、なぜ高さ方向(Z軸)の座標を求める式はZZ = (coef[0] * XX + coef[1] * YY + intercept) / -coef[2]のように複雑なのでしょうか?
XXとYYそれぞれに係数をかけて足し、切片も足して、さらに3つ目の特徴量の係数で割る...?一体なぜこの式でZ座標が決まるのか全く分からなかったので、分かりやすく解説していただけたらありがたいです。
該当のソースコード
Python
1import numpy as np 2from sklearn.datasets import make_blobs 3from sklearn.svm import LinearSVC 4from mpl_toolkits.mplot3d import Axes3D, axes3d 5 6X, y = make_blobs(centers=4, random_state=8) 7y = y%2 8X_new = np.hstack([X, X[:, 1:] ** 2]) 9 10linear_svm_3d = LinearSVC().fit(X_new, y) 11coef, intercept = linear_svm_3d.coef_.ravel(), linear_svm_3d.intercept_ 12 13figure = plt.figure() 14ax = Axes3D(figure, elev=-152,azim=-26) 15xx = np.linspace(X_new[:, 0].min() - 2, X_new[:, 0].max() + 2, 50) 16yy = np.linspace(X_new[:, 1].min() - 2, X_new[:, 1].max() + 2, 50) 17 18XX, YY = np.meshgrid(xx, yy) 19ZZ = (coef[0] * XX + coef[1] * YY + intercept) / -coef[2] 20ax.plot_surface(XX,YY, ZZ, rstride=8, cstride=8, alpha=0.3) 21ax.scatter(X_new[mask, 0], X_new[mask, 1], X_new[mask, 2], c="b", cmap=mglearn.cm2, s=60) 22ax.scatter(X_new[~mask, 0], X_new[~mask, 1], X_new[~mask, 2], c="r", marker="^", cmap=mglearn.cm2, s=60) 23 24ax.set_xlabel("feature0") 25ax.set_ylabel("feature1") 26ax.set_zlabel("feature ** 2") 27
実行結果
> 一体なぜこの式でZ座標が決まるのか
https://manabitimes.jp/math/679
に書かれてるように、
ax + by + cz + d = 0
を満たす点(x, y, z)の集合が平面だからです
上記式から
cz = -(ax + by + d)
z = -(ax + by + d) / c

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