python MachinelEarning机器学习笔记day04

day04-样本均衡-置信概率-网格搜索-事件预测-K均值、均值漂移、凝聚层次聚类--
    十一、支持向量机
        1.原理
            1)寻求最优的分类边界,
                即被支持向量所夹持的分类带宽度达到最大值,
                取其中心线作为分类边界。
                最优边界要求:
                正确:对大部分样本可以正确地划分类别
                泛化:最大化支持向量间接
                公平:与支持向量等距
                简单:线性、直线或平面,分割超平面。
                1)安全性:分类带最宽
                2)公平性:分类带中心线
                3)简单性:线性边界,分割超平面
                4)对于在原始维度空间中无法线性分割的样本,通过特定的核函数
                增加特征,即升高维度,在高维度空间寻求分割超平面。
            2)基于核函数的升维变换
                通过名为核函数的特征变换,增加新的特征,使得低维度空间
                中的线性不可分问题变为高纬度空间中的线性可分问题。
        2.接口
            import sklearn.svm as svm
            分类器模型=svm.SVC(kernel=核函数类型, ...)
            回归器模型=svm.SVR(kernel=核函数类型, ...)
        3.不同核函数的分类效果
            1)线性核函数:linear
                svm.SVC(kernel='linear'),不通过核函数进行维度提升,
                尽量在原始维度空间中寻求线性分类边界。
                代码示例:svm_line.py
                    import numpy as np
                    import matplotlib.pyplot as mp
                    import sklearn.model_selection as ms
                    import sklearn.metrics as sm
                    import sklearn.svm as svm
                    x,y = [],[]
                    with open('../../day01/data/multiple1.txt','r') as f:
                        for line in f.readlines():
                            data = [float(substr) for substr in line.split(',')]
                            x.append(data[:-1])
                            y.append(data[-1])
                    x ,y = np.array(x),np.array(y,dtype=int)
                    #划分训练集合测试集
                    train_x,test_x,train_y,test_y = \
                        ms.train_test_split(x,y,test_size=0.25,random_state=7)
                    #基于线性核函数的支持向量机分类器
                    model = svm.SVC(kernel='linear')
                    model.fit(train_x,train_y)#用训练集进行训练
                    l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
                    b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
                    grid_x = np.meshgrid(np.arange(l, r, h),np.arange(b, t, v))
                    flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()] #列合并
                    flat_y = np.zeros(len(flat_x), dtype=int)#进行自动分类
                    flat_y = model.predict(flat_x) #注意,在这里才开始训练
                    grid_y = flat_y.reshape(grid_x[0].shape)
                    pred_test_y = model.predict(test_x)#用测试集测试并产生预测值
                    #获得分类报告
                    cr = sm.classification_report(test_y,pred_test_y)
                    print(cr)
                    mp.figure('SVM Linear Classification',facecolor='lightgray')
                    mp.title('SVM Linear Classification', fontsize=20)
                    mp.xlabel('x', fontsize=14)
                    mp.ylabel('y', fontsize=14)
                    mp.tick_params(labelsize=10)
                    mp.pcolormesh(grid_x[0], grid_x[1], grid_y,
                        cmap='gray')
                    mp.scatter(test_x[:, 0], test_x[:, 1],
                        c=test_y, cmap='brg', s=80)
                    mp.show()
            2)多项式核函数:poly
                svm.SVC(kernel='poly',degree=最高次幂)
                通过多项式函数增加原始样本特征的高次方幂
                代码示例:svm_poly.py
                    import numpy as np
                    import matplotlib.pyplot as mp
                    import sklearn.model_selection as ms
                    import sklearn.metrics as sm
                    import sklearn.svm as svm
                    x,y = [],[]
                    with open('../../day01/data/multiple2.txt','r') as f:
                        for line in f.readlines():
                            data = [float(substr) for substr in line.split(',')]
                            x.append(data[:-1])
                            y.append(data[-1])
                    x ,y = np.array(x),np.array(y,dtype=int)
                    #划分训练集合测试集
                    train_x,test_x,train_y,test_y = \
                        ms.train_test_split(x,y,test_size=0.25,random_state=7)
                    #基于3次多项式核函数的支持向量机分类器
                    model = svm.SVC(kernel='poly',degree=3)
                    model.fit(train_x,train_y)#用训练集进行训练
                    l, r, h = x[:, 0].min() - 1, x[:, 0].max() + 1, 0.005
                    b, t, v = x[:, 1].min() - 1, x[:, 1].max() + 1, 0.005
                    grid_x = np.meshgrid(np.arange(l, r, h),np.arange(b, t, v))
                    flat_x = np.c_[grid_x[0].ravel(), grid_x[1].ravel()] #列合并
                    flat_y = np.zeros(len(flat_x), dtype=int)#进行自动分类
                    flat_y = model.predict(flat_x) #注意,在这里才开始训练
                    grid_y = flat_y.reshape(grid_x[0].shape)
                    pred_test_y = model.predict(test_x)#用测试集测试并产生预测值
                    #获得分类报告
                    cr = sm.classification_report(test_y,pred_test_y)
                    print(cr)
                    mp.figure('SVM Poly Classification',facecolor='lightgray')
                    mp.title('SVM Poly Classification', fontsize=20)
                    mp.xlabel('x', fontsize=14)
                    mp.ylabel('y', fontsize=14)
                    mp.tick_params(labelsize=10)
                    mp.pcolormesh(grid_x[0], grid_x[1], grid_y,
                        cmap='gray')
                    mp.scatter(test_x[:, 0], test_x[:, 1],
                        c=test_y, cmap='brg', s=80)
                    mp.show()
            3)径向基核函数
                svm.SVC(kernel='rbf',C=正则强度,gamma=正态分布标准差)
                超参数:正则强度一般为400,正态分布标准差一般为0.01
                代码示例:svm_rbf.py  
                    import numpy as np
                    import matplotlib.pyplot as mp
                    import sklearn.model_selection as ms
                    import sklearn.metrics as sm
                    import sklearn.svm as svm
                    x,y = [],[]
                    with open('../../day01/data/multiple2.txt','r') as f:
                        for line in f.readlines():
                            data = [float(substr) for substr in line.split(',')]
                            x.append(data[:-1])
                            y.append(data[-1])
                    x ,y = np.array(x),np.array(y,dtype=int)
                    #划分训练集合测试集
                    train_x,test_x,train_y,test_y = \
                        ms.train_test_split(x,y,test_size=0.25,random_state=7)
                    #基于径向基核函数的支持向量机分类器
                    model = svm.SVC(kernel='rbf',C=600,gamma=0.01)
                    model.fit(train_x,train_y)#用训练集进行训练
                

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值