在 3-space 和 Python 中绘制最大边距超平面

Plot maximum-margin hyperplane in 3-space with Python

我在 SVM 上找到了这个非常酷的笔记本 :

https://github.com/jakevdp/sklearn_tutorial/blob/master/notebooks/03.1-Classification-SVMs.ipynb

但是有点沮丧,因为它没有显示如何在 3-space 中绘制最大边距。我已尽力而为,但不知道如何去做...例如,我想将其绘制在以下表示形式上(取自笔记本):

此外,如果支持向量可以被包围,那将是顶部的雪利酒。

这是一个很好的问题,但是提供的笔记本实际上是"lying"。这不是内核的工作方式,虽然这种可视化很酷,但实际情况并非如此 "inside SVM"。让我们把这个放在一边,关注如何在这个投影 space 中绘制 3D 分离超平面( 不是 RBF 投影 space)。

您所要做的就是:

  1. 线性 SVM 拟合到用于该图的 3D 数据。
  2. 提取权重 (clf.coefs_) 和偏差 (clf.intercept_)
  3. Plot 3d hyperplane 法线 (clf.coefs_) 和距原点的距离 (clf.intercept_)
import numpy as np
from sklearn.svm import SVC
from sklearn.datasets import make_circles
X_1_2, y = make_circles(100, factor = .1, noise=.1)
X_3 = np.exp(-(X_1_2[:,0] ** 2 + X_1_2[:,1] ** 2))
X = np.insert(X_1_2, 2, X_3, axis=1)
clf = SVC(kernel='linear').fit(X,y)
w = clf.coef_
w1 = w [:, 0]
w2 = w [:, 1]
w3 = w [:, 2]
b = clf.intercept_
sv = clf.support_vectors_
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
xx, yy = np.meshgrid(range(-1,2), range(-1,2))
zz = (-w1 * xx - w2 * yy - b) * 1. /w3
%matplotlib notebook
plt3d = plt.subplot(projection='3d')
plt3d.plot_wireframe(xx, yy, zz, rstride=1, cstride=1, color='purple')
plt3d.scatter3D(X[:, 0], X[:, 1], X[:, 2], c=y, s=50, cmap='winter')
plt3d.scatter3D(sv[:, 0], sv[:, 1], sv[:, 2], s=150)
plt.show()