机器学习技法第一次作业

最近刚做完机器学习技法的第一次作业,三次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:

这题引用别人的解法

假设K是二维的,将每个选项带入计算,只有一个结果矩阵是半正定的。

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:

这边用的文件差点忘记提了,这边的二分类问题我都是把原数据转成-1,1两种,数据生成的代码直接贴在下面吧

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')



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章