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

2018-08-15  本文已影响0人  PumpkinGG
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参数以及预测方法即可。

上一篇下一篇

猜你喜欢

热点阅读