最近刚做完机器学习技法的第一次作业,三次attempt后达到了400,但是有些问题还不是很清楚,作业中用的是libsvm+python3。作为一个ML爱好者跟新手,更多的是记录作业的过程,当时做的也蛮辛苦的,如果有错,望客官海涵。
Question 1:
没什么可说的- -!
Question 2:
没什么可说的- -!
Question 3~4:
我没用选择QP solver,直接使用svm并把参数C设置了一个比较大的值。
我先手动生成了一个训练集
-1 1:1.0 2:0.0
-1 1:0.0 2:1.0
-1 1:0.0 2:-1.0
1 1:-1.0 2:0.0
1 1:0.0 2:2.0
1 1:0.0 2:-2.0
1 1:-2.0 2:0.0
相关代码
import os
os.chdir('D:/developEnvironment/libsvm-3.20/python')
from svmutil import *
y, x = svm_read_problem('E:/ML/Taiwan_ML/homework2/3/train.txt')
model = svm_train(y, x, '-t 1 -c 10000 -g 1 -r 1 -d 2')
support_vectors = model.get_SV()
support_vector_coefficients = model.get_sv_coef()
import numpy as np
sv=np.array(support_vectors)
svc=np.array(support_vector_coefficients)
最后输出SVs和SV_COEF的值(sv_coef的值是lanrange multiplier和对应y的乘积)
其中我没有搞清楚为什么sv中只包含一个特征,-1:0.0 表示什么也不清楚。我对应训练数据把sv补全了。整理了每个特征向量和其对应的coef
n X1 X2 COEF
4 -1 0 0.887
5 0 2 0.150
6 0 -2 0.368
2 0 1 -0.485
3 0 -1 -0.921
明显1和7对应的乘子为0,则第三题很明显了。
由于sv中只有一个x1非0,因此很容易算出来x1的二次项的系数为0.887,再算出了整个式子的常数项为1.666,第四题的答案也出来了。
Question 5:
没什么可说的- -!
Question 6~10:
根据机器学习技法视频关于对偶问题的推导,这些都能推导出来- -!
Question 11:
将对应的值带入公式,两个问题的objective相等就可以了,当时忘记w前面的1/2,导致结果少了一个根号二分之一。
Question 12:
这题没有想出,希望有人能解答一下。
Question 13:
这题引用别人的解法
Question 14:
我没有很严谨的推导出来,不过我的想法是核函数的值跟w负相关,当核函数放大p倍,w则缩小p倍。而objective还是原来的最优解则C也要缩小p倍。Question 15:
直接贴代码了,值得注意的是model.get_sv_coef()存的是
的值,当时也差了半天- -!
import os
os.chdir('D:/developEnvironment/libsvm-3.20/python')
from svmutil import *
y, x = svm_read_problem('E:/ML/Taiwan_ML/homework2/15/train0.txt')
model = svm_train(y, x, '-t 0 -c 0.01')
support_vectors = model.get_SV()
support_vector_coefficients = model.get_sv_coef()
import numpy as np
sv=np.array(support_vectors)
svc=np.array(support_vector_coefficients)
import numpy as np
w=np.array([0,0])
for i in range(0,2389):
w=w+np.array([svc[i]*sv[i][1],svc[i]*sv[i][2]])
输出w的值
Question 16:
直接上代码吧
import os
os.chdir('D:/developEnvironment/libsvm-3.20/python')
from svmutil import *
for i in range(0,5):
outfile='E:/ML/Taiwan_ML/homework2/15/train'+str(i*2)+'.txt'
y, x = svm_read_problem(outfile)
model = svm_train(y, x, '-t 1 -d 2 -r 1 -g 1 -c 0.01')
print(str(i*2)+'hahahahahhahahah')
p_label, p_acc, p_val = svm_predict(y, x, model)
输出结果是
很明显选8咯
Question 17:
直接贴代码和结果吧
import os
os.chdir('D:/developEnvironment/libsvm-3.20/python')
from svmutil import *
for i in range(0,5):
outfile='E:/ML/Taiwan_ML/homework2/15/train'+str(i*2)+'.txt'
y, x = svm_read_problem(outfile)
model = svm_train(y, x, '-t 1 -d 2 -r 1 -g 1 -c 0.01')
print(str(i*2)+'hahahahahhahahah')
support_vectors = model.get_SV()
support_vector_coefficients = model.get_sv_coef()
import numpy as np
sv=np.array(support_vectors)
svc=np.array(support_vector_coefficients)
res=0
for i in range(0,svc.shape[0]):
if(svc[i]>0):
res=res+svc[i]
else:
res=res-svc[i]
print(str(res)+'wocao')
Question 18:
这题拿着上面的代码也能跑出来,不知能不能直接推导证明之类的- -!
Question 19:
照例是代码跟结果
import os
import math
os.chdir('D:/developEnvironment/libsvm-3.20/python')
from svmutil import *
for i in range(0,7):
trainfile='E:/ML/Taiwan_ML/homework2/15/train0.txt'
testfile='E:/ML/Taiwan_ML/homework2/15/test0.txt'
y, x = svm_read_problem(trainfile)
yt,xt = svm_read_problem(testfile)
parameter='-c 0.1 -g '+str(math.pow(10,i))
model = svm_train(y, x, parameter)
print('g='+str(math.pow(10,i))+'hahahahahhahahah')
p_label, p_acc, p_val = svm_predict(yt, xt, model)
Question 20:
cv也是手动写的,每次随机生成train和test,代码如下
import os
import random
import math
os.chdir('D:/developEnvironment/libsvm-3.20/python')
from svmutil import *
trainfile='E:/ML/Taiwan_ML/homework2/15/train0.txt'
gamaArr=[0,0,0,0,0]
for time in range(0,100):
acc=0
n_acc=0
print(str(time)+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
for i in range(0,5):
parameter='-c 0.1 -g '+str(math.pow(10,i))
y, x = svm_read_problem(trainfile)
yt=list()
xt=list()
for j in range(0,1000):
index=random.randint(0,len(x)-1)
yt.append(y[index])
xt.append(x[index])
del y[index]
del x[index]
model = svm_train(y, x, parameter)
p_label, p_acc, p_val = svm_predict(yt, xt, model)
if(p_acc[0]>acc):
acc=p_acc[0]
n_acc=i
print(parameter)
print(p_acc[0])
print(acc)
print(n_acc)
gamaArr[n_acc]=gamaArr[n_acc]+1
print(gamaArr)
这个结果当时跑了好久,这边就不跑了,你们可以下到本机上跑一下
Question 20:
import numpy as np
data=np.loadtxt('E:/ML/Taiwan_ML/homework2/features.train.txt')
x=data[:,1:]
for i in range(0,5):
outfile='E:/ML/Taiwan_ML/homework2/15/train'
y=data[:,0:1]
y=y==i*2
y=y*2-1
data2=np.hstack((y,x))
outfile=outfile+str(i*2)+'.txt'
np.savetxt(outfile,data2,fmt="%d 1:%s 2:%s",newline='\r\n')