使用Python在3空间绘制最大边距超平面

时间:2016-12-21 16:08:27

标签: python plot machine-learning svm data-science

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

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

但有点沮丧'因为它没有显示如何绘制3空间的最大边距。我已经尽了最大努力,但对于如何做到这一点毫无头绪......例如,我想将它绘制在下面的代表中(取自笔记本):

enter image description here

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

2 个答案:

答案 0 :(得分:2)

这是一个非常好的问题,但提供的笔记本实际上是“撒谎”#34;这不是内核的工作方式,虽然这种可视化很酷,但它并不是在SVM"内部发生的事情。让我们把它放在一边,重点关注如何在这个投影空间中绘制3D分离超平面(不是 RBF投影空间)。

您所要做的就是:

  1. 线性 SVM拟合到用于此图的3D数据。
  2. 提取权重(clf.coefs_)和偏见(clf.intercept _)
  3. Plot 3d hyperplane正常(clf.coefs_)和距离原点的距离(clf.intercept _)

答案 1 :(得分:0)

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()

enter image description here