• sklearn机器学习——day08


     支持向量机

     

    支持向量机(SVM,也称为支持向量网络),是机器学习中获得关注最多的算法没有之一

    源于统计学原理,SVM是最接近深度学习的机器学习算法

    支持向量机分类器工作原理

    支持向量机的分类方法,是在这组分布中找出一个超平面作为决策边界,使模型在数据上的 分类误差尽量接近于小,尤其是在未知数据集上的分类误差(泛化误差)尽量小

    线性SVC的损失函数

    决策边界:

                                                           

    使用这个表达式来表示我们的决策边界,

    参数向量 的方向必然是垂直于我们的决策边界     

     函数间隔与几何间隔

    线性SVM的拉格朗日对偶函数和决策函数 

     将约束条件加到方程中

     拉格朗日函数也分为两部分。第一部分和我们原始的损失函数一样,第二部分呈现了我们带有不等式的约束条件。 我们希望, 不仅能够代表我们原有的损失函数 和约束条件,还能够表示我们想要最小化损失函数来 求解 和 的意图

    拉格朗日对偶函数 

     

    由于两个求偏导结果中都带有未知的拉格朗日乘数 ,因此我们还是无法求解出 和 ,我们必须想出一种方法来 求解拉格朗日乘数 。幸运地是,拉格朗日函数可以被转换成一种只带有 ,而不带有 和 的形式,这种形式被 称为拉格朗日对偶函数。在对偶函数下,我们就可以求解出拉格朗日乘数 ,然后带入到上面推导出的(1)和(2)式 中来求解 和 。

    对偶差异(dual gap),即拉格朗日函数的最优解与其对偶函数的最优解 之间的差值: 

     线性SVM可视化

    1. from sklearn.datasets import make_blobs
    2. from sklearn.svm import SVC
    3. import matplotlib.pyplot as plt
    4. import numpy as np
    5. X,y = make_blobs(n_samples=50, centers=2, random_state=0,cluster_std=0.6)
    6. plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
    7. plt.xticks([])
    8. plt.yticks([])
    9. plt.show()
    10. #首先要有散点图
    11. plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
    12. ax = plt.gca() #获取当前的子图,如果不存在,则创建新的子图
    13. #获取平面上两条坐标轴的最大值和最小值
    14. Tsai
    15. #首先要有散点图
    16. plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
    17. ax = plt.gca() #获取当前的子图,如果不存在,则创建新的子图
    18. #获取平面上两条坐标轴的最大值和最小值
    19. xlim = ax.get_xlim()
    20. ylim = ax.get_ylim()
    21. #在最大值和最小值之间形成30个规律的数据
    22. axisx = np.linspace(xlim[0],xlim[1],30)
    23. axisy = np.linspace(ylim[0],ylim[1],30)
    24. axisy,axisx = np.meshgrid(axisy,axisx)
    25. #我们将使用这里形成的二维数组作为我们contour函数中的X和Y
    26. #使用meshgrid函数将两个一维向量转换为特征矩阵
    27. #核心是将两个特征向量广播,以便获取y.shape * x.shape这么多个坐标点的横坐标和纵坐标
    28. xy = np.vstack([axisx.ravel(), axisy.ravel()]).T
    29. #其中ravel()是降维函数,vstack能够将多个结构一致的一维数组按行堆叠起来
    30. #xy就是已经形成的网格,它是遍布在整个画布上的密集的点
    31. plt.scatter(xy[:,0],xy[:,1],s=1,cmap="rainbow")
    32. #理解函数meshgrid和vstack的作用
    33. a = np.array([1,2,3])
    34. b = np.array([7,8])
    35. #两两组合,会得到多少个坐标?
    36. #答案是6个,分别是 (1,7),(2,7),(3,7),(1,8),(2,8),(3,8)
    37. v1,v2 = np.meshgrid(a,b)
    38. v1
    39. v2
    40. v = np.vstack([v1.ravel(), v2.ravel()]).T
    41. #建模,通过fit计算出对应的决策边界
    42. clf = SVC(kernel = "linear").fit(X,y)
    43. Z = clf.decision_function(xy).reshape(axisx.shape)
    44. #重要接口decision_function,返回每个输入的样本所对应的到决策边界的距离
    45. #然后再将这个距离转换为axisx的结构,这是由于画图的函数contour要求Z的结构必须与X和Y保持一致
    46. #画决策边界和平行于决策边界的超平面
    47. ax.contour(axisx,axisy,Z
    48. ,colors="k"
    49. ,levels=[-1,0,1] #画三条等高线,分别是Z为-1,Z为0和Z为1的三条线
    50. ,alpha=0.5
    51. ,linestyles=["--","-","--"])
    52. ax.set_xlim(xlim)
    53. ax.set_ylim(ylim)
    54. #记得Z的本质么?是输入的样本到决策边界的距离,而contour函数中的level其实是输入了这个距离
    55. #让我们用一个点来试试看
    56. plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
    57. plt.scatter(X[10,0],X[10,1],c="black",s=50,cmap="rainbow")
    58. clf.decision_function(X[10].reshape(1,2))
    59. plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
    60. ax = plt.gca()
    61. ax.contour(axisx,axisy,P
    62. ,colors="k"
    63. ,levels=[-3.33917354]
    64. ,alpha=0.5
    65. ,linestyles=["--"])
    66. #将上述过程包装成函数:
    67. def plot_svc_decision_function(model,ax=None):
    68. if ax is None:
    69. ax = plt.gca()
    70. xlim = ax.get_xlim()
    71. ylim = ax.get_ylim()
    72. x = np.linspace(xlim[0],xlim[1],30)
    73. y = np.linspace(ylim[0],ylim[1],30)
    74. Y,X = np.meshgrid(y,x)
    75. xy = np.vstack([X.ravel(), Y.ravel()]).T
    76. P = model.decision_function(xy).reshape(X.shape)
    77. ax.contour(X, Y, P,colors="k",levels=[-1,0,1],alpha=0.5,linestyles=["--","-","--"])
    78. ax.set_xlim(xlim)
    79. ax.set_ylim(ylim)
    80. #则整个绘图过程可以写作:
    81. clf = SVC(kernel = "linear").fit(X,y)
    82. plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
    83. plot_svc_decision_function(clf)
    84. clf.predict(X)
    85. #根据决策边界,对X中的样本进行分类,返回的结构为n_samples
    86. clf.score(X,y)
    87. #返回给定测试数据和标签的平均准确度
    88. clf.support_vectors_
    89. #返回支持向量
    90. clf.n_support_
    91. #返回每个类中支持向量的个数
    92. #推广到非线性情况
    93. from sklearn.datasets import make_circles
    94. X,y = make_circles(100, factor=0.1, noise=.1)
    95. X.shape
    96. y.shape
    97. plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
    98. plt.show()
    99. clf = SVC(kernel = "linear").fit(X,y)
    100. plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap="rainbow")
    101. plot_svc_decision_function(clf)
    102. #为非线性数据增加维度并绘制3D图像
    103. #定义一个由x计算出来的新维度r
    104. r = np.exp(-(X**2).sum(1))
    105. rlim = np.linspace(min(r),max(r),0.2)
    106. from mpl_toolkits import mplot3d
    107. #定义一个绘制三维图像的函数
    108. #elev表示上下旋转的角度
    109. #azim表示平行旋转的角度
    110. def plot_3D(elev=30,azim=30,X=X,y=y):
    111. ax = plt.subplot(projection="3d")
    112. ax.scatter3D(X[:,0],X[:,1],r,c=y,s=50,cmap='rainbow')
    113. ax.view_init(elev=elev,azim=azim)
    114. ax.set_xlabel("x")
    115. ax.set_ylabel("y")
    116. ax.set_zlabel("r")
    117. plt.show()
    118. plot_3D()

     

  • 相关阅读:
    前端已学后续待补充博客
    STM32C0开发(1)----SPI 驱动WS2812灯珠
    wind量化交易接口怎么用?
    Google vs IBM vs Microsoft: 哪个在线数据分析师证书最好
    SpringCloud微服务实践之七 网关(Gateway)
    SpringMVC的数据响应
    ES6...
    Linux多路I/O复用入门必读 -- epoll实现原理以及使用方法
    NetApp FAS2554故障灯常亮case处理过程分享
    面试官猛的一问:Spring的Bean注入如何解决循环依赖的?
  • 原文地址:https://blog.csdn.net/weixin_44267765/article/details/126858600