機器學習技法第二次作業

趁着deadline的前一天把作業做完了,主要是後面兩個編程的題目比較花時間。下面直接進入主題吧。

Question 1

這題直接求導就好了

Question 2

黑塞矩陣,求二階偏導(是叫這個吧)就求出來了

Question 3

這個看了視頻應該都知道了

Question 4

替換一下帶入公式就行了,兩個值都是正值所以要與0求一個max

Question 5

Question 6

好像挺簡單
x2
x2

Question 7

假設兩個點是(a,a*a)和(b,b*b),由這兩點確定的直線是(a+b)*x-a*b
a+b的期望就是1,a*b的期望是a的期望乘以b的期望(iid)就是1/4,然後答案就出來啦
x2
x2

Question 8

這個沒什麼好說的- -!
x2
x2

Question 9

這個1/99不用解釋了吧

x2
x2

Question 10

因爲資料都是整形,所以theta取大於當前的最小整數就好啦

x2
x2
x2

Question 11

x2x2x2
x2
2d(R-L)+2)我覺得這題有點不對,他沒保證所有stumb的數量是2d(R-L)+2,
如果數量是這個的話,答案就是如下
Kds(x,x)=2d(RL)4xx1+2
x2
x2下面這個式子就是針對兩個資料,分類器結果相同的數量減去分類器結果不同的數量。
x2
x2
Kds(x,x)=(ϕds(x))T(ϕds(x))
也就是所有分類器的數量減去兩倍
分類結果不同的分類器的數量。所有分類器最多有
x2
x22d(R-L)+2個

而分類不同的分類器的那條切線正好夾在兩個數據之間。就是x2
x2

xx1
x2
x2
Kds(x,x)=(ϕds(x))T(ϕds(x))

Question 12~18

這題好爽,一段代碼做六題,不對是七題。我直接貼代碼吧

import numpy as np
import math
trD=np.loadtxt('E:/ML/Taiwan_ML/skill/homework2/hw2_adaboost_train.dat')
teD=np.loadtxt('E:/ML/Taiwan_ML/skill/homework2/hw2_adaboost_test.dat')
trX=trD[:,0:trD.shape[1]-1]
trY=trD[:,trD.shape[1]-1]
teX=teD[:,0:teD.shape[1]-1]
teY=teD[:,teD.shape[1]-1]
#teX=[:,0:2]
#teY=[:,2:3]

def predict(para,x):
    y=np.ones(x.shape[0])
    for i in range(0,x.shape[0]):
        value=0
        for t in range(0,para.shape[0]):
            cy=0
            if(x[i][para[t][0]]>para[t][1]):
                cy=1
            else:
                cy=-1
            cy=cy*para[t][2]
            value=value+cy*para[t][3]
        if value>0:
            y[i]=1
        else:
            y[i]=-1
    return y

def zeroOneErr(y1,y2):
    return sum(y1!=y2)/y2.shape[0]

x=trX
y=trY
dataSize=trX.shape[0]
featureSize=trX.shape[1]
iterTimes=300
u=np.empty((iterTimes+1,dataSize))
alpht=np.empty((iterTimes))
para=np.empty((iterTimes,4))
u[0]=1/trD.shape[0]



for t in range(0,iterTimes):
    #print(sum(u[t]))
    stheta=0
    si=0
    ss=1
    se=1
    #print(u[t])
    for i in range(0,featureSize):
        
        #print("feature!!!!!",i)
        currentX=x[:,i]
        sortedIndex=np.argsort(currentX)
        flag=currentX[sortedIndex[0]]-1
        #print("flag",flag)
        ci=i
        cs=1
        ctheta=currentX[0]-1
        eup=0
        edown=0
        currentY=np.ones(dataSize)
        for j in range(0,dataSize):
            edown=edown+u[t][j]
            if currentX[j]<=flag:
                currentY[j]=-1
            if(currentY[j]!=y[j]):
                eup=eup+u[t][j]
        e=eup/edown
        #print("e",e)
       

        if e>0.5:
            e=1-e
            cs=-1*cs
        if e<se:
            stheta=ctheta
            si=ci
            ss=cs
            se=e
            #print("se1",se)
        for j in range(0,dataSize):
            #print("j~~~~~~~~",j)
            if currentY[sortedIndex[j]]==y[sortedIndex[j]]*cs:
                e=e+1*(u[t][sortedIndex[j]]/edown)
                #print("e add",e)
            else:
                e=e-1*(u[t][sortedIndex[j]]/edown)
                #print("e min",e)
            if e>0.5:
                e=1-e
                cs=-1*cs
            #print("e",e)
            if e<se:
                stheta=currentX[sortedIndex[j]]
                ss=cs
                si=ci
                se=e
                #print("se2",se)
    para[t][0]=si
    para[t][1]=stheta
    para[t][2]=ss
    #print(si)
    #print(stheta)
    #print(ss)
    #print(se)
    
    f=math.sqrt((1-se)/se)
    para[t][3]=math.log(f,math.e)
    for j in range(0,dataSize):
        cy=0
        if(x[j][si]>stheta):
            cy=1
        else:
            cy=-1
        cy=cy*ss
        if(cy==y[j]):
            u[t+1][j]=u[t][j]/f
        else:
            u[t+1][j]=u[t][j]*f

py=predict(para,teX)            
sh=zeroOneErr(teY,py)

這代碼寫得有點醜陋,有點亂。寫得我當時自己都暈了,算的結果不對。我自己寫了一個簡單的數據一步步調試看了一下,把中間幾個bug修改過來了。
大概說一下我個人的思路吧。首先是將當前維度的feature排序嘛,剛開始可以將所有都分爲正類,然後按排序順序依次加一個到負類裏面去,並且判斷當前改變
與實際結果是否相同就是這一句
x2x2

if currentY[sortedIndex[j]]==y[sortedIndex[j]]*cs:
如果相同就將error減去當前資料的err,否則就加上。(cs對應於公式中的參數S,1還是-1)
當其他參數相同,只有S不同時,兩個hypotheses的err加起來肯定是1,選其中一個較小的就可以了,這樣就把S不同的情況直接討論進去了。

執行結果我就不再跑了

x2
x2
Kds(x,x)=(ϕds(x))T(ϕds(x))

Question 19~20

這邊代碼也是剛開始寫錯了,後來改的,還是沒有完全理解好representer theorem(這個詞組還是我剛剛查的=。=,記不住)
下面就是代碼
import numpy as np
import math
data=np.loadtxt("E:/ML/Taiwan_ML/skill/homework2/hw2_lssvm_all.dat")
dataTrain=data[0:400,:]
dataTest=data[400:,:]
traX=dataTrain[:,0:data.shape[1]-1]
traY=dataTrain[:,data.shape[1]-1]
teX=dataTest[:,0:data.shape[1]-1]
teY=dataTest[:,data.shape[1]-1]

def gaussK(x,y,g):
    return math.exp(-1*g*sum((x-y)*(x-y)))

_gammaArr=[32,2,0.125]
_lambdaArr=[0.001,1,1000]
dataSize=dataTrain.shape[0]
featureSize=traX.shape[1]
for _gamma in _gammaArr:
    for _lambda in _lambdaArr:
        k=np.empty((dataSize,dataSize))
        n=0
        for i in range(0,dataSize):
            for j in range(0,i+1):
                #print(_gamma)
                #print(sum((traX[i]-traX[j])*(traX[i]-traX[j])))
                #print(traX[i]-traX[j])
                #print(sum((traX[i]-traX[j])*(traX[i]-traX[j])))
                
                k[j][i]=gaussK(traX[i],traX[j],_gamma)
                n=n+1
                if i!=j:
                    k[i][j]=k[j][i]
                    n=n+1
                #print(k[i][j])
        #print(k[0][0])
        #print(_lambda)
        para=_lambda*np.eye(dataSize)+k
        #print(para[0][0])
        #print(n)
        #print(k)
        #print("!!!!!!!!!!!!!!!")
        #print(para)
        #pp=para
        para=np.linalg.inv(para)
        #print(para*pp)
        #traY=np.transpose(traY)
        beta=para*np.transpose(np.matrix(traY))
        #print("beta",beta.shape)
        #w=np.zeros(featureSize)
        beta=np.array(beta)
        #for i in range(0,dataSize):
        #    s=beta[i][0]*traX[i,:]
        #    #print("s",s)
         #   w=w+s
        #print("w",w)
        py=np.zeros(teY.shape[0])
        for i in range(0,teY.shape[0]):
            for j in range(0,traX.shape[0]):
                py[i]=py[i]+beta[j]*gaussK(teX[i],traX[j],_gamma)
        #py=np.matrix(teX)*np.transpose(np.matrix(w))
        #py=np.array(py)
        #py=py[:,0]
        #print(py)
        for i in range(0,py.shape[0]):
            if(py[i]>0):
                py[i]=1
            else:
                py[i]=-1
        #print(py)
        e=sum(py!=teY)/py.shape[0]
        print(py.shape[0],_gamma,_lambda,e)
19題的結果如下

x2
x2

400 32 0.001 0.0
400 32 1 0.0
400 32 1000 0.0
400 2 0.001 0.0
400 2 1 0.0
400 2 1000 0.0
400 0.125 0.001 0.0
400 0.125 1 0.03
400 0.125 1000 0.2425




20題的結果如下
x2
x2
100 32 0.001 0.45
100 32 1 0.45
100 32 1000 0.45
100 2 0.001 0.44
100 2 1 0.44
100 2 1000 0.44
100 0.125 0.001 0.46
100 0.125 1 0.45
100 0.125 1000 0.39

只有一個小於0.4的,我都不太敢選- -!

  
x2最後今天的作業就結束了,下週的課我還沒開始看,作業已經出來了,要抓緊了。
如果答案有什麼錯誤,新手多多包涵,歡迎指正。
再見

x2

x2
x2
Kds(x,x)=(ϕds(x))T(ϕds(x))
400 32 0.001 0.0
400 32 1 0.0
400 32 1000 0.0
400 2 0.001 0.0
400 2 1 0.0
400 2 1000 0.0
400 0.125 0.001 0.0
400 0.125 1 0.03
400 0.125 1000 0.2425
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章