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参数以及预测方法即可。
网友评论