• 支撑向量机SVM


    1.06支撑向量机思维导图

    06支撑向量机思维导图

    2.今日份实验

    2.1 scikit-learn中的SVM

    import numpy as np  #导包
    import matplotlib.pyplot as plt
    
    from sklearn import datasets
    iris = datasets.load_iris()
    X = iris.data
    y = iris.target
    X = X[y<2,:2]      #y<2即取y=0和y=1的两个类别,并只取前两个特征
    y = y[y<2]
    
    plt.scatter(X[y==0,0], X[y==0,1], color='red')
    plt.scatter(X[y==1,0], X[y==1,1], color='blue')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果如下所示:
    运行结果

    2.2 训练SVC模型

    • 数据标准化操作
    from sklearn.preprocessing import StandardScaler
    standardScaler = StandardScaler()
    standardScaler.fit(X)
    X_standard = standardScaler.transform(X)
    
    • 1
    • 2
    • 3
    • 4
    from sklearn.svm import LinearSVC
    svc = LinearSVC(C=1e9) #C值越大,容错能力就越小,就越趋向于Hard Margin SVM
    svc.fit(X_standard, y)
    
    • 1
    • 2
    • 3

    运行结果

    • 传入模型和边界,定义决策边界函数
    def plot_decision_boundary(model, axis):
        
        x0, x1 = np.meshgrid(
            np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),
            np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),
        )
        X_new = np.c_[x0.ravel(), x1.ravel()]
        y_predict = model.predict(X_new)
        zz = y_predict.reshape(x0.shape)
        from matplotlib.colors import ListedColormap
        custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
        plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    plot_decision_boundary(svc, axis=[-3, 3, -3, 3])
    plt.scatter(X_standard[y==0,0], X_standard[y==0,1])
    plt.scatter(X_standard[y==1,0], X_standard[y==1,1])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    运行结果如下所示:
    运行结果

    • 当C=0.01时,SVM的容错能力变大
    svc2 = LinearSVC(C=0.01)
    svc2.fit(X_standard, y)
    
    • 1
    • 2
    plot_decision_boundary(svc2, axis=[-3, 3, -3, 3])
    plt.scatter(X_standard[y==0,0], X_standard[y==0,1])
    plt.scatter(X_standard[y==1,0], X_standard[y==1,1])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    运行结果如下图所示:
    运行结果

    • 求Margin对应的上下两根直线
    svc.coef_
    
    • 1

    在这里插入图片描述

    svc.intercept_ #截距
    
    • 1

    在这里插入图片描述

    • 绘制SVC的决策边界,包括上下两根线
    def plot_svc_decision_boundary(model, axis):
        
        x0, x1 = np.meshgrid(
            np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),
            np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),
        )
        X_new = np.c_[x0.ravel(), x1.ravel()]
    
        y_predict = model.predict(X_new)
        zz = y_predict.reshape(x0.shape)
    
        from matplotlib.colors import ListedColormap
        custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
        
        plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
        
        w = model.coef_[0]     #取出第0个元素
        b = model.intercept_[0]
        
        # w0*x0 + w1*x1 + b = 0
        # => x1 = -w0/w1 * x0 - b/w1  #x1是纵坐标轴
        plot_x = np.linspace(axis[0], axis[1], 200)
        up_y = -w[0]/w[1] * plot_x - b/w[1] + 1/w[1]  #上边界直线方程
        down_y = -w[0]/w[1] * plot_x - b/w[1] - 1/w[1]  #下边界直线方程
        
        up_index = (up_y >= axis[2]) & (up_y <= axis[3])  #过滤操作
        down_index = (down_y >= axis[2]) & (down_y <= axis[3])
        plt.plot(plot_x[up_index], up_y[up_index], color='black')
        plt.plot(plot_x[down_index], down_y[down_index], color='black')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    plot_svc_decision_boundary(svc, axis=[-3, 3, -3, 3])
    plt.scatter(X_standard[y==0,0], X_standard[y==0,1])
    plt.scatter(X_standard[y==1,0], X_standard[y==1,1])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    公式推导
    运行结果如下所示:
    运行结果

    • 当C=0.01时的情况
    plot_svc_decision_boundary(svc2, axis=[-3, 3, -3, 3])
    plt.scatter(X_standard[y==0,0], X_standard[y==0,1])
    plt.scatter(X_standard[y==1,0], X_standard[y==1,1])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    运行结果如下所示:
    运行结果

    2.3 SVM中使用多项式特征

    import numpy as np
    import matplotlib.pyplot as plt
    
    • 1
    • 2
    from sklearn import datasets
    
    x,y = datasets.make_moons()#利用月亮函数生成数据集
    
    • 1
    • 2
    • 3
    x.shape #数据集有100个样本,每个样本有2个特征
    
    • 1

    输出结果

    y.shape
    
    • 1

    输出结果

    plt.scatter(x[y==0,0],x[y==0,1])
    plt.scatter(x[y==1,0],x[y==1,1])
    plt.show()
    
    • 1
    • 2
    • 3

    运行结果如下所示:
    运行结果

    • 为数据几增加噪音后的情况
    X, y = datasets.make_moons(noise=0.15, random_state=666)#为数据集增加噪音
    
    plt.scatter(X[y==0,0], X[y==0,1])
    plt.scatter(X[y==1,0], X[y==1,1])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运行结果如下所示:
    运行结果

    2.4 用多项式特征的SVM

    #总结:先升维,再计算
    from sklearn.preprocessing import PolynomialFeatures,StandardScaler
    from sklearn.svm import LinearSVC
    from sklearn.pipeline import Pipeline
    
    def PolynomialSVC(degree,C=1.0):
        return Pipeline([
            ("poly",PolynomialFeatures(degree=degree)),
            ("std_scaler",StandardScaler()),
            ("linearSVC",LinearSVC(C=C))
        ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    poly_svc = PolynomialSVC(degree=3)
    poly_svc.fit(X, y)
    
    • 1
    • 2

    输出结果

    #绘制图像
    def plot_decision_boundary(model, axis):
        
        x0, x1 = np.meshgrid(
            np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1, 1),
            np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1, 1),
        )
        X_new = np.c_[x0.ravel(), x1.ravel()]
    
        y_predict = model.predict(X_new)
        zz = y_predict.reshape(x0.shape)
    
        from matplotlib.colors import ListedColormap
        custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
        
        plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    plot_decision_boundary(poly_svc, axis=[-1.5, 2.5, -1.0, 1.5])
    plt.scatter(X[y==0,0], X[y==0,1])
    plt.scatter(X[y==1,0], X[y==1,1])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    运行结果如下所示:
    运行结果

    2.5 使用多项式核函数的SVM

    from sklearn.svm import SVC
    
    def PolynomialKernelSVC(degree, C=1.0):
        return Pipeline([
            ("std_scaler", StandardScaler()),
            ("kernelSVC", SVC(kernel="poly", degree=degree, C=C,coef0=0))
        ])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    poly_kernel_svc = PolynomialKernelSVC(degree=3)
    poly_kernel_svc.fit(X, y)
    
    • 1
    • 2

    输出结果

    plot_decision_boundary(poly_kernel_svc, axis=[-1.5, 2.5, -1.0, 1.5])
    plt.scatter(X[y==0,0], X[y==0,1])
    plt.scatter(X[y==1,0], X[y==1,1])
    plt.show()
    
    • 1
    • 2
    • 3
    • 4

    运行结果如下所示:
    运行结果

  • 相关阅读:
    (七)Bean的实例化方式
    SubDAO与Moonbeam网络集成
    leetcode 2366. Minimum Replacements to Sort the Array(数组排序的最少替换数)
    python知识:从PDF 提取文本
    动手学深度学习_目标检测算法 R-CNN 系列
    FPGA复位专题---(42)复位信号高扇出?
    IPKISS Tutorials ------查看使用_generate_instances 方法创建图形的端点
    ELK日志保留7天-索引生命周期策略
    [附源码]计算机毕业设计项目管理系统的专家评审模块Springboot程序
    手把手教你IDEA创建SSM项目结构
  • 原文地址:https://blog.csdn.net/cailirong123/article/details/126276774