SVM4种核函数在简单数据集下的效果对比

爱被打了一巴掌 2023-07-16 03:59 48阅读 0赞

小彩笔的学习笔记,时间匆忙只贴代码

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from matplotlib.colors import ListedColormap
  4. from sklearn import svm#from sklearn.svm import SVC 两者都可以
  5. from sklearn.datasets import make_circles, make_moons, make_blobs,make_classification
  6. n_samples = 100
  7. datasets = [
  8. make_moons(n_samples=n_samples, noise=0.2, random_state=0),
  9. make_circles(n_samples=n_samples, noise=0.2, factor=0.5, random_state=1),
  10. make_blobs(n_samples=n_samples, centers=2, random_state=5),#分簇的数据集
  11. make_classification(n_samples=n_samples,n_features = 2,n_informative=2,n_redundant=0, random_state=5)
  12. #n_features:特征数,n_informative:带信息的特征数,n_redundant:不带信息的特征数
  13. ]
  14. Kernel = ["linear","poly","rbf","sigmoid"]
  15. #四个数据集分别是什么样子呢?
  16. for X,Y in datasets:
  17. plt.figure(figsize=(5,4))
  18. plt.scatter(X[:,0],X[:,1],c=Y,s=50,cmap="rainbow")

在这里插入图片描述
在这里插入图片描述

  1. nrows=len(datasets)
  2. ncols=len(Kernel) + 1
  3. fig, axes = plt.subplots(nrows, ncols,figsize=(20,16))

在这里插入图片描述

  1. nrows=len(datasets)
  2. ncols=len(Kernel) + 1
  3. fig, axes = plt.subplots(nrows, ncols,figsize=(20,16))
  4. #第一层循环:在不同的数据集中循环
  5. for ds_cnt, (X,Y) in enumerate(datasets):
  6. #在图像中的第一列,放置原数据的分布
  7. ax = axes[ds_cnt, 0]
  8. if ds_cnt == 0:
  9. ax.set_title("Input data")
  10. ax.scatter(X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.cm.Paired,edgecolors='k')
  11. ax.set_xticks(())
  12. ax.set_yticks(())
  13. #第二层循环:在不同的核函数中循环
  14. #从图像的第二列开始,一个个填充分类结果
  15. for est_idx, kernel in enumerate(Kernel):
  16. #定义子图位置
  17. ax = axes[ds_cnt, est_idx + 1]
  18. #建模
  19. clf = svm.SVC(kernel=kernel, gamma=2).fit(X, Y)
  20. score = clf.score(X, Y)
  21. #绘制图像本身分布的散点图
  22. ax.scatter(X[:, 0], X[:, 1], c=Y
  23. ,zorder=10
  24. ,cmap=plt.cm.Paired,edgecolors='k')
  25. #绘制支持向量
  26. ax.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=50,
  27. facecolors='none', zorder=10, edgecolors='k')# facecolors='none':透明的
  28. #绘制决策边界
  29. x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
  30. y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
  31. #np.mgrid,合并了我们之前使用的np.linspace和np.meshgrid的用法
  32. #一次性使用最大值和最小值来生成网格
  33. #表示为[起始值:结束值:步长]
  34. #如果步长是复数,则其整数部分就是起始值和结束值之间创建的点的数量,并且结束值被包含在内
  35. XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
  36. #np.c_,类似于np.vstack的功能
  37. Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()]).reshape(XX.shape)
  38. #填充等高线不同区域的颜色
  39. ax.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
  40. #绘制等高线
  41. ax.contour(XX, YY, Z, colors=['k', 'k', 'k'], linestyles=['--', '-', '--'],
  42. levels=[-1, 0, 1])
  43. #设定坐标轴为不显示
  44. ax.set_xticks(())
  45. ax.set_yticks(())
  46. #将标题放在第一行的顶上
  47. if ds_cnt == 0:
  48. ax.set_title(kernel)
  49. #为每张图添加分类的分数
  50. ax.text(0.95, 0.06, ('%.2f' % score).lstrip('0')
  51. , size=15
  52. , bbox=dict(boxstyle='round', alpha=0.8, facecolor='white')
  53. #为分数添加一个白色的格子作为底色
  54. , transform=ax.transAxes #确定文字所对应的坐标轴,就是ax子图的坐标轴本身
  55. , horizontalalignment='right' #位于坐标轴的什么方向
  56. )
  57. plt.tight_layout()
  58. plt.show()

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,48人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SVM函数选择

    SVM支持向量机,一般用于二分类模型,支持线性可分和非线性划分。SVM中用到的核函数有线性核’linear’、多项式核函数pkf以及高斯核函数rbf。 当训练数据线性可分时,

    相关 SVM理解之函数

    核函数是什么 在使用SVM分类器处理非线性问题时,核函数是绕不过的坎,其实关于核函数,首先需要记住这两句话: 1. 核函数可以使向量直接在原来的低维空间中进行内积计算