機器學習技法第一次作業

最近剛做完機器學習技法的第一次作業,三次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')



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