机器学习技法第二次作业
来源:互联网 发布:简易代刷主站源码 编辑:程序博客网 时间:2024/04/27 21:41
趁着deadline的前一天把作业做完了,主要是后面两个编程的题目比较花时间。下面直接进入主题吧。
Question 1
这题直接求导就好了Question 2
黑塞矩阵,求二阶偏导(是叫这个吧)就求出来了Question 3
这个看了视频应该都知道了Question 4
替换一下带入公式就行了,两个值都是正值所以要与0求一个maxQuestion 5
Question 6
好像挺简单
x2
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
x2
Question 8
这个没什么好说的- -!x2
x2
x2
Question 9
这个1/99不用解释了吧x2
x2
x2
Question 10
因为资料都是整形,所以theta取大于当前的最小整数就好啦x2
x2
x2
Question 11
x2x2x2x2
2d(R-L)+2)我觉得这题有点不对,他没保证所有stumb的数量是2d(R-L)+2,
如果数量是这个的话,答案就是如下
Kds(x,x′)=2d(R−L)−4∥x−x′∥1+2
x2
x2下面这个式子就是针对两个资料,分类器结果相同的数量减去分类器结果不同的数量。
x2
x2下面这个式子就是针对两个资料,分类器结果相同的数量减去分类器结果不同的数量。
x2
x2
Kds(x,x′)=(ϕds(x))T(ϕds(x′))
x2
Kds(x,x′)=(ϕds(x))T(ϕds(x′))
也就是所有分类器的数量减去两倍
分类结果不同的分类器的数量。所有分类器最多有
x2
x22d(R-L)+2个
x22d(R-L)+2个
而分类不同的分类器的那条切线正好夹在两个数据之间。就是x2
x2
∥x−x′∥1
x2
∥x−x′∥1
x2
x2
Kds(x,x′)=(ϕds(x))T(ϕds(x′))
x2
Kds(x,x′)=(ϕds(x))T(ϕds(x′))
Question 12~18
这题好爽,一段代码做六题,不对是七题。我直接贴代码吧
import numpy as npimport mathtrD=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 ydef zeroOneErr(y1,y2): return sum(y1!=y2)/y2.shape[0]x=trXy=trYdataSize=trX.shape[0]featureSize=trX.shape[1]iterTimes=300u=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]*fpy=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′))
x2
Kds(x,x′)=(ϕds(x))T(ϕds(x′))
Question 19~20
这边代码也是刚开始写错了,后来改的,还是没有完全理解好representer theorem(这个词组还是我刚刚查的=。=,记不住)
下面就是代码
import numpy as npimport mathdata=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
x2
20题的结果如下
x2
x2
只有一个小于0.4的,我都不太敢选- -!
x2
100 32 0.001 0.45100 32 1 0.45100 32 1000 0.45100 2 0.001 0.44100 2 1 0.44100 2 1000 0.44100 0.125 0.001 0.46100 0.125 1 0.45100 0.125 1000 0.39
只有一个小于0.4的,我都不太敢选- -!
x2最后今天的作业就结束了,下周的课我还没开始看,作业已经出来了,要抓紧了。
如果答案有什么错误,新手多多包涵,欢迎指正。
x2
x2
x2
Kds(x,x′)=(ϕds(x))T(ϕds(x′))
1 0
- 机器学习技法第二次作业
- 机器学习技法第二次作业编程题1
- 机器学习技法第一次作业
- 机器学习技法作业7
- 机器学习技法第三次作业
- 机器学习基石第二次作业
- 机器学习技法作业二题目12-18
- 机器学习技法作业二题目19-20
- 机器学习技法作业三题目13-15
- 机器学习技法作业三题目16-18
- 机器学习技法作业三题目19-20
- 机器学习技法
- 学习笔记---机器学习技法
- 机器学习技法系列一
- 机器学习技法系列二
- 机器学习技法系列三
- 机器学习技法系列五
- 机器学习技法-Adaptive Boosting
- TreeMap倒序以及遍历
- Mac book 系统清理
- 数组 字典 集合
- Unescaped control character around character 189
- 第八周 项目二 建立链表的算法库
- 机器学习技法第二次作业
- 最全Pycharm教程(35)——Pycharm中使用Vagrant
- Myeclipse TIPS
- javascript中数组的迭代器方法
- LDD: Ch 4 调试技术
- HDOJ--2023
- 创龙 TMS320DM8148 开发板
- 浅谈Adaboost算法
- 通信实验结果处理计算器