机器学习基石 作业二

1 计算一下本来预测对与预测错时加上噪音导致的错误率然后相加即可。

2 选择一个λ\lambdaλ的值让μ\muμ的系数为0。

3 根据VC bound 公式带入计算即可,N=46000的时候error最接近0.05。下面的代码可以计算不同的N与目标error之间的差距。

def compute(N,err):delta = 0.05dvc = 10res = np.sqrt(8/N*np.log(4*pow(2*N,dvc)/delta))return res-err

4 编程计算这几个不等式的上限。感觉不是很有意思。将N=10000和N=5的时候分别带入看哪个最小即可。有两个隐函数需要使用sympy.solve来当做等式解方程。代码如下:

dvc = 50
delta = 0.05
N = 5def origiVC():return np.sqrt(8/N*np.log(4*pow(2*N,dvc)/delta))def rpVC():r1 = np.sqrt(2*np.log(2.0*N*pow(N,dvc))/N)r2 = np.sqrt(2/N*np.log(1/delta))return  r1+r2+1/Ndef pvVC():epsilon = sympy.symbols('epsilon')r1 = sympy.solve(epsilon-sympy.sqrt(1/N*sympy.log(6*((2*N)**dvc)/delta)),epsilon)return r1def dVC():epsilon = sympy.symbols('epsilon')r1 = sympy.solve(epsilon-sympy.sqrt(0.5/N*(4*epsilon*(1+epsilon) + np.log(4)+dvc*sympy.log(N**2.0)-np.log(delta))),epsilon)return r1def vVC():return np.sqrt(16/N*(np.log(2)+dvc*np.log(N*1.0)-np.log(np.sqrt(delta))))if __name__ == '__main__':print(origiVC())print(rpVC())print(pvVC())print(dVC())print(vVC())

5.
6 做错了。看到个别人的一个解释。

https://blog.csdn.net/zyghs/article/details/78762070 这个老哥的博客里有这题稍微详细的解释。还是找规律写出通式,高中数学真重要.jpg

  1. 根据公式,VC维是3
    8 还是将N=1开始慢慢找,发现N=3时能shatter的也是7种。因此得到答案。这相当于是一个二维的positive interval的题目。可以看ppt上关于Positive interval的假设,N个点,可以选择N+1个位置作为interval的起点或终点。每次的interval需要一个终点一个起点,也就是CN+12C_{N+1}^{2}CN+12​,或者起点终点都在最边上,这两种是一种情况,都分为全负因此再加一。


9 跟视频里讲的一样,d维感知机。答案是d+1。


10 这个题目主要是理解题目意思比较费劲。s是一个d维向量的集合,而且每个d维向量对应一个+1或一个-1。因此无论N多大,能够将样例最多分类为22d2^{2^{d}}22d种结果,也就是VC维是2d2^{d}2d。

11 三角波调节上下平移取绝对值之后的正负号。好像对于所有N都能够将其完全shatter。因此VC维无穷大。

12 选项1:可以无限递归至N=1,显然不对。 选项2:是个常数不对。选项3:应该是个[mH(N),2Nm_{H}(N),2^{N}mH​(N),2N]之间的数,所以可以。选项4:指数是dvc/2d_{vc}/2dvc​/2,不能保证是上界。

13 其它选项都没有疑问。第二个选项确实不太懂。不过第五题引用的博客里那个老哥说可能是因为这个函数是跳跃式地增长的。而一个growth函数应该是连续增长的(只要VC维不是0),应该是排列组合的一个性质。我觉得老哥说得对。

14 交集的部分可能是空,最好的情况也就是等于VC维最小的一个假设集合。不是很好解释,自行体会。

15 这个并集的下界很好理解,最小也是所有假设集合里VC维最大的那个的值。而稍微难以解释。如果每一个假设集合都没有交集,因此显然他们的并集的vc维上界需要将所有的vc维都加起来,但是这样还不够。因为并集了以后不同的假设集合之间的组合也会带来一些新的“自由度”。所以应该还有一项。至于为啥是K-1不是非常明确。

16 将s是正号以及负号,θ\thetaθ大于0还是小于0的情况进行组合一下,简单计算得出结果。后面几题需要理解算法流程进而实现。

17-18 结果分别是0.15 0.25。需要理解算法的具体实现。这个算法主要是选择正负号s和分隔点θ\thetaθ。而分隔点可以直接根据每一个数据点xxx的位置进行选择。比如题目里有20个数据,那么将这20个数据排序好,之后将每一个点的坐标作为θ\thetaθ来比较EinE_{in}Ein​选出最优结果。代码如下:

import numpy as np
import randomdef genData(N,noise):x = []y = []for i in range(N):x1 = random.uniform(-1,1)prob = random.uniform(0,1)if prob < noise:y1 = -sign(x1,True)else:y1 = sign(x1,True)x.append(x1)y.append(y1)return np.array(x),np.array(y)def errorRate(x,y,s,theta,h):errorNum = 0for i in range(len(x)):if y[i] != h(x[i],s,theta):errorNum += 1return errorNum/len(x)def hFunc(x,s,theta):if s:return sign(x-theta,s)else:return -sign(x-theta,s)def sign(v,s):if v == 0:return selif v < 0:return -1else:return 1def trainDecisionStump(N,noise):x,y = genData(N,noise) #N=20,noise=0.2E_in = 1best_s = Truebest_theta = 0thetas = np.sort(x) #排序x用来作为备选的thetass = [True,False] #先遍历s是正的时候for theta in thetas:for s in ss:E = errorRate(x,y,s,theta,hFunc)if E < E_in:E_in = Ebest_s = sbest_theta = thetaindex, = np.where(thetas == best_theta)if index[0] == 0:best_theta = (-1+best_theta)/2else:best_theta = (thetas[index[0]-1]+best_theta)/2E_out = computeEout(best_s,best_theta)return E_in,E_outdef computeEout(s,theta):if s:return 0.5+0.3*(np.abs(theta)-1)else:return 0.5-0.3*(np.abs(theta)-1)def main():iteration = 5000N = 20noise = 0.2err_in_sum = 0err_out_sum = 0for i in range(iteration):err_in, err_out = trainDecisionStump(N,noise)err_in_sum += err_inerr_out_sum += err_out if i%100 == 99:print("iteration: ",i+1)print("total errorRate in sample is",err_in_sum/iteration)print("total errorRate out of sample is",err_out_sum/iteration)if __name__ == '__main__':main()

19-20 多维形式的算法。需要理解多维算法的流程。每一维度上都选择一个最好的函数。而最终在这些不同维度最好的函数里面选择一个最好的,并且以这个作为最终的多维函数。也就是说最终只选择某个维度作为分类维度,其它维度都舍弃掉了。最终结果是0.25,0.35。代码如下:

import numpy as np
import random
import requestsdef getData(url):content = requests.get(url).contentcontent = content.decode('utf-8')x = []y = []content = content.split('\n')for line in content[:-1]:data = line.split(' ')y.append(int(data[-1]))x1 = data[1:-1]for i in range(len(x1)):x1[i] = float(x1[i])x.append(x1)x = np.array(x)y = np.array(y)return x,ydef errorRate(x,y,s,theta,h,dimension):errorNum = 0for i in range(len(x)):if y[i] != h(x[i][dimension],s,theta):errorNum += 1return errorNum/len(x)def hFunc(x,s,theta):if s:return sign(x-theta,s)else:return -sign(x-theta,s)def sign(v,s):if v == 0:return selif v < 0:return -1else:return 1def trainDecisionStump(x,y):dimensions = len(x[0])E_in = 1best_s = Truebest_theta = 0best_dim = 0for dim in range(dimensions):thetas = np.sort(x[:,dim]) #排序x用来作为备选的thetass = [True,False] #先遍历s是正的时候for theta in thetas:for s in ss:E = errorRate(x,y,s,theta,hFunc,dim)if E < E_in:E_in = Ebest_s = sbest_theta = thetabest_dim = dimreturn best_s,best_theta,best_dim,E_indef main():trainUrl = 'https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_math/hw2_train.dat'testUrl = 'https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_math/hw2_test.dat'trainX,trainY = getData(trainUrl)testX,testY = getData(testUrl)s,theta,dim,err_in = trainDecisionStump(trainX,trainY)err_out = errorRate(testX,testY,s,theta,hFunc,dim)print("total errorRate in sample is",err_in)print("total errorRate out of sample is",err_out)if __name__ == '__main__':main()

机器学习基石 作业二相关推荐

  1. 机器学习基石-作业二-第10题分析

    题目如上图所示,答案是::在网上看到的答案中有一个很好的解释就是说在一个n纬的欧几里德空间里,分别按照参数做一个垂直于每个轴的超平面,这些超平面能够打散这么多个点.首先我承认这个事实,具体的证明还没做 ...

  2. 机器学习基石-作业三-第2题分析以及通过H证明EIN的讨论

    题目: 这是机器学习基石作业三种的第二小题,额,在网上看了很多解答(解答也不多)感觉都没有说清楚为什么,所以励志清楚滴解决一下这个问题,经过努力,自认为得到了详细的解答,内容如下: (一)解决选项(e ...

  3. 机器学习基石作业03:二阶泰勒展开,特征转换,逻辑回归

    本文总结机器学习基石的第三次作业,主要包括误差函数.特征转换.二阶泰勒展开,以及线性回归,逻辑回归的实现. 问题1和问题2:关于线性回归问题中 E i n E_{in} Ein​和 E o u t E ...

  4. 机器学习基石-作业四-代码部分

    这次的作业内容主要就是对带正则化项的线性规划的闭式解做各种操作:选择.把数据分成训练集和交叉验证.k-折交叉验证.完全套公式就可以了,这里唯一的一个问题就是偏移量参不参加正则化: 在林老师的课程中,最 ...

  5. 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 课后习题解答

    今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业三的习题解答.笔者在做这些题目时遇到很多困难,当我在网上寻找答案时却找不到,而林老 ...

  6. 机器学习基石-作业三-代码部分

    梯度下降迭代和牛顿迭代,gradient_and_newton.py # -*- coding:utf-8 -*- # Author: Evan Mi import numpy as np" ...

  7. 机器学习基石作业一中的PLA和POCKET_PLA实现

    前提:文中使用的数据是本人下载下来以后自己处理过的,就是把文件中的所有分隔符都换成了空格.所以load_data方法只能加载我自己的数据,想要加载原生数据的话需要自己写load_data方法. 两个算 ...

  8. 机器学习基石作业二中的DECISION_STUMP实现

    概要:在林老的题目描述中,DECISION_STUMP(其实就是"决策桩",也就是只有一层的决策树).题目中提到了的选去是把属性(一维的)按照从小到大的顺序排列以后取两个挨着的值的 ...

  9. 機器學習基石 机器学习基石(Machine Learning Foundations) 作业1 习题解答

    大家好,我是Mac Jiang,今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业1的习题解答.笔者是在学习了Ng的Machine ...

  10. 机器学习课堂笔记-作业二基本实现思路

    机器学习课堂笔记-作业二基本实现思路 作业2-年收入判断 项目描述 数据集介绍 项目要求 数据准备 环境配置/安装 事先说明 一.概率生成模型 1. 读取数据 整理训练数据 2. 协方差矩阵计算 手动 ...

最新文章

  1. 内核aio_Java面试题BIO、NIO、AIO有什么区别?
  2. bzoj1588[HNOI2002]营业额统计——双向链表
  3. Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type
  4. IIS7.5 部署WCF项目问题集锦
  5. PeriodicityText in CRM Fiori SalesPipeline
  6. 2019年全球最受欢迎数据库新鲜出炉,你猜中了吗?
  7. Linux Ubuntu 18.04安装JDK、Hadoop、Hbase以及图形界面
  8. 《统计学习方法》代码全解析——第三部分k近邻法
  9. YYKit作者之 iOS保持界面流畅的技巧
  10. 用主机搭建本地服务器局域网
  11. node 使用 cnpm
  12. 使用BeautifulSoup解析网页内容
  13. 【C语言】十进制转换二进制
  14. linux设置双屏拼接_Linux下双屏显示设置
  15. win7定时关机命令_磨刀三分钟 | 以【设置定时关机】为例,学会计算机界的如来神掌第1式...
  16. 微信公众号行业排行榜周榜
  17. Redis 实现热度统计和已读未读功能
  18. 买个云服务器有啥用_买了一台云服务器到底能干嘛?
  19. 如何建立一个真实光栅结构的光导
  20. AUC的是如何计算的

热门文章

  1. onlyoffice开发java_OnlyOffice功能及演示
  2. WPF 入门教程 TextBox详解
  3. Excel,遗忘密码后如何撤销工作表保护密码
  4. 网站备案 ICP备案流程
  5. 2022-02-27周报
  6. 计算机静音图标无法更改怎么办,声音图标没了不要着急,用金山毒霸2011进行修复 - 金山安全专题 - 声音图标没了怎么办? - 安全专题...
  7. 曾宪武《物联网通信技术》课后答案(一)
  8. 《the django book》part2 django的安装使用
  9. lua redisson执行lua脚本
  10. 大学生性价比计算机推荐,2018大学生笔记本推荐_良心笔记本推荐【性价比之王】-太平洋电脑网...