习题7.2

  已知正例点习题7.2 - 图1,负例点习题7.2 - 图2,试求最大间隔分离平面和分类决策函数,并在图中挂出分离超平面、间隔边界及支持向量。


解答:

  1. %matplotlib inline
  2. from sklearn.svm import SVC
  3. # 加载数据
  4. X = [[1, 2], [2, 3], [3, 3], [2, 1], [3, 2]]
  5. y = [1, 1, 1, -1, -1]
  6. # 训练SVM模型
  7. clf = SVC(kernel='linear', C=10000)
  8. clf.fit(X, y)
  9. print("w =", clf.coef_)
  10. print("b =", clf.intercept_)
  11. print("support vectors =", clf.support_vectors_)
  12. w = [[-1. 2.]]
  13. b = [-2.]
  14. support vectors = [[3. 2.]
  15. [1. 2.]
  16. [3. 3.]]

最大间隔分离超平面:习题7.2 - 图3
分类决策函数:习题7.2 - 图4
支持向量:习题7.2 - 图5

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. # 绘制数据点
  4. color_seq = ['red' if v == 1 else 'blue' for v in y]
  5. plt.scatter([i[0] for i in X], [i[1] for i in X], c=color_seq)
  6. # 得到x轴的所有点
  7. xaxis = np.linspace(0, 3.5)
  8. w = clf.coef_[0]
  9. # 计算斜率
  10. a = -w[0] / w[1]
  11. # 得到分离超平面
  12. y_sep = a * xaxis - (clf.intercept_[0]) / w[1]
  13. # 下边界超平面
  14. b = clf.support_vectors_[0]
  15. yy_down = a * xaxis + (b[1] - a * b[0])
  16. # 上边界超平面
  17. b = clf.support_vectors_[-1]
  18. yy_up = a * xaxis + (b[1] - a * b[0])
  19. # 绘制超平面
  20. plt.plot(xaxis, y_sep, 'k-')
  21. plt.plot(xaxis, yy_down, 'k--')
  22. plt.plot(xaxis, yy_up, 'k--')
  23. # 绘制支持向量
  24. plt.xlabel('$x^{(1)}$')
  25. plt.ylabel('$x^{(2)}$')
  26. plt.scatter(clf.support_vectors_[:, 0],
  27. clf.support_vectors_[:, 1],
  28. s=150,
  29. facecolors='none',
  30. edgecolors='k')
  31. plt.show()

image.png