美文网首页
林轩田--机器学习技法--作业1

林轩田--机器学习技法--作业1

作者: PumpkinGG | 来源:发表于2018-08-15 08:40 被阅读0次
    2018-08-14 16-25-56屏幕截图.png

    1、数据量比较少,直接进行坐标转换后在坐标系里画出数据点,很明显可以看出最优超平面是:
    Phi1(X)= 5。
    2、借助了 Chih-Jen Lin教授的LibSVM算法包,编写了Python程序进行训练,代码如下:

    from svm import *
    from svmutil import *
    import numpy as np
    
    def loaddata(file):  #读取数据,借用了之前学习SVM时编的读数据函数,顺便把问题1里的数据存入了文件里
        f = open(file)
        try:
            lines = f.readlines()
        finally:
            f.close()
        
        example_num = len(lines)
        dimension = len(lines[0].strip().split()) - 1  ##SVM算法中W与b分离,因此不需在features前加1
        
        features = np.zeros((example_num, dimension))
        labels = np.zeros((example_num))    ##LibSVM需要的数据形式
        
        for index, line in enumerate(lines):
            item = lines[index].strip().split()
            features[index,:] = [float(feature) for feature in item[0:-1]]
            labels[index] = float(item[-1])
            
        return features, labels
    
    X, Y = loaddata("tr1.dat")  ##读出数据
    prob  = svm_problem(Y, X)  ##生成LibSVM所需数据格式
    param = svm_parameter('-t 1 -d 2 -g 2 -r 1 -c 1e10') 
    ##设置SVM训练参数
    ##-t 1——传统svm
    ##-d 2——二项式核函数
    ##-g 2 -r 1——二项式核函数的参数
    ##-c 1e10——把C设置比较大,近似Hard-Margin SVM
    m = svm_train(prob, param)  ##进行训练
    svm_save_model('heart_scale.model', m)  ##保存生成的model
    

    打开model,可以看到:

    svm_type c_svc
    kernel_type polynomial
    degree 2
    gamma 2
    coef0 1
    nr_class 2
    total_sv 5
    rho 1.6664460166666673
    label 1 -1
    nr_sv 3 2
    SV
    0.33324751041666667 1:-1 
    0.077211222222222292 2:2 
    0.089423364583333331 2:-2 
    -0.23773411458333346 2:1 
    -0.26214798263888894 2:-1 
    

    其中,SV下面的5行就是在X空间的支持向量,每行第一个参数为数据项对应的alpha。
    3、4、nonlinear curves不一定一样,不再详述。


    2018-08-14 16-46-04屏幕截图.png

    5、6、7题根据课程里的推导过程推一遍就可以了,基本没什么区别,第7题没太弄清楚,随便根据理解做了一下,下面是推导:


    6.jpg
    5-7.jpg 2018-08-15 08-45-31屏幕截图.png

    8、这个结论还是很显然的,Soft-Margin与Hard-Margin的优化问题,区别只是Soft-Margin比Hard-Margin多了一个对alpha的约束条件,即alpha<=C,若Hard-Margin的优化结果alpha均小于等于C,那此结果也是Soft-Margin的最优结果。具体就不证明了,我也没证明(偷懒)。
    9、思路是根据valid kernels的必要条件,证明下面核函数的gram矩阵对称并且半正定。不知道怎么证明,参考其他人的答案是C,以后看到相关的解释再说吧。半正定矩阵的推广性质忘得差不多啦。
    10、和7题思路类似,根据添加p后和未添加p的优化问题的区别去看。


    2018-08-15 10-39-15屏幕截图.png

    11-16为编程题,使用LibSVM库,源代码如下:

    from svm import *
    from svmutil import *
    import numpy as np
    
    def loaddata(file):
        f = open(file)
        try:
            lines = f.readlines()
        finally:
            f.close()
        
        example_num = len(lines)
        dimension = len(lines[0].strip().split()) - 1  ##SVM算法中W与b分离,因此不需在features前加1
        
        features = np.zeros((example_num, dimension))
        labels = np.zeros((example_num))    ##LibSVM需要的数据形式
        
        for index, line in enumerate(lines):
            item = lines[index].strip().split()
            features[index,:] = [float(feature) for feature in item[1:]]   ##根据Experience给出的data set数据格式进行改变
            labels[index] = float(item[0])
            
        return features, labels
    
    X_train,Y_train = loaddata("features.train.txt")  ##读取数据
    Y_train = [1 if i==0 else 0 for i in Y_train]  ##处理labels为二分类 0 vs (not 0)
    
    prob  = svm_problem(Y_train, X_train)  ##生产libsvm所需数据格式
    
    param = svm_parameter('-t 0 -c 1e-5')
    '''
    设置train参数
    options:
            -s svm_type : set type of SVM (default 0)
                0 -- C-SVC              (multi-class classification)
                1 -- nu-SVC             (multi-class classification)
                2 -- one-class SVM
                3 -- epsilon-SVR        (regression)
                4 -- nu-SVR             (regression)
            -t kernel_type : set type of kernel function (default 2)
                0 -- linear: u'*v
                1 -- polynomial: (gamma*u'*v + coef0)^degree
                2 -- radial basis function: exp(-gamma*|u-v|^2)
                3 -- sigmoid: tanh(gamma*u'*v + coef0)
                4 -- precomputed kernel (kernel values in training_set_file)
            -d degree : set degree in kernel function (default 3)
            -g gamma : set gamma in kernel function (default 1/num_features)
            -r coef0 : set coef0 in kernel function (default 0)
            -c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
            -n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5)
            -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
            -m cachesize : set cache memory size in MB (default 100)
            -e epsilon : set tolerance of termination criterion (default 0.001)
            -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)
            -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0)
            -wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1)
            -v n: n-fold cross validation mode
            -q : quiet mode (no outputs)
    '''
    m = svm_train(prob, param)  ##进行训练
    svm_save_model('train_11.model', m)  ##保存训练得到的model
    X_test,Y_test = loaddata("features.test.txt")  ##读取数据
    Y_test = [1 if i==0 else 0 for i in Y_test]  ##处理labels为二分类 0 vs (not 0)
    svm_predict(Y_test, X_test, m)  ##用test set进行预测
    

    使用LibSVM进行SVM训练很简单,根据不同问题,选择合适的train参数以及预测方法即可。

    相关文章

      网友评论

          本文标题:林轩田--机器学习技法--作业1

          本文链接:https://www.haomeiwen.com/subject/cnuvbftx.html