趁着deadline的前一天把作業做完了,主要是後面兩個編程的題目比較花時間。下面直接進入主題吧。
Question 1
這題直接求導就好了Question 2
黑塞矩陣,求二階偏導(是叫這個吧)就求出來了Question 3
這個看了視頻應該都知道了Question 4
替換一下帶入公式就行了,兩個值都是正值所以要與0求一個maxQuestion 5
Question 6
x2
Question 7
x2
Question 8
這個沒什麼好說的- -!x2
Question 9
這個1/99不用解釋了吧x2
Question 10
因爲資料都是整形,所以theta取大於當前的最小整數就好啦x2
x2
x2
Question 11
x2x2x2x2
2d(R-L)+2)我覺得這題有點不對,他沒保證所有stumb的數量是2d(R-L)+2,
x2
x2下面這個式子就是針對兩個資料,分類器結果相同的數量減去分類器結果不同的數量。
x2
Kds(x,x′)=(ϕds(x))T(ϕds(x′))
x22d(R-L)+2個
x2
∥x−x′∥1
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修改過來了。if currentY[sortedIndex[j]]==y[sortedIndex[j]]*cs:
如果相同就將error減去當前資料的err,否則就加上。(cs對應於公式中的參數S,1還是-1)x2
Kds(x,x′)=(ϕds(x))T(ϕds(x′))
Question 19~20
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
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