機器學習基石 机器学习基石(Machine Learning Foundations) 作业1 习题解答 (续)
这里写的是 习题1 中的 18 , 19, 20 题的解答。
Packet 方法,我这里是这样认为的,它所指的贪心算法是不管权重更新是否会对train data有改进都进行修正,因为这里面没有区分是否可以线性分割,如果线性可分那么每次的更新都注定是要使train data的分割效果得到提升,但是如果不是线性可分的,那么并不是每次的权重修正都可以使效果得到提升。 这时候的贪心算法是指不考虑每次权重的修正是否可以使优化效果得到提升,有错误的分割则进行一次权重修正。这种情况下我们不能保证一定会得到完美的分割,算法是否可以达到稳定而终止也是不确定的,该情况下则设置权重的最多更新次数。同时,将所有更新权重后得到的权重之中获得最优的权重。
根据上一个博客的实验,发现不管是不是线性可分的数据集,在权重更新的时候都不能保证一定会使数据分割的效果得到提升,也就是说每次的权重修正并不一定会使训练误差减小,基本可以说训练误差会随着权重修正而上下起伏的,但是线性可分的数据最终会得到完全的正确分割,线性不可分的数据最终也无法得到完全正确的分割,所以这时候Packet 方法上场了,也就是说对于不可以线性分割的数据我们如果还是用完全分割作为终止条件那么算法将永远不会停止,所以我们在Packet算法中以权重UPDATE的次数作为终止条件,又因为不论是线性可分还是不可分的数据集权重的优化效果都是上下起伏的,所以在Packet方法中我们只选择权重更新历史记录中最优的结果作为实验的最终答案。
第18题, Python编写:
#!/usr/bin/env python3
#encoding:UTF-8
import random
import copy
import urllib.request L=4
url_1="https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_math/hw1_18_train.dat"
url_2="https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_math/hw1_18_test.dat" "数据读入"
def dataLoad(url):
repones=urllib.request.urlopen(url)
dataList=repones.readlines()
dataList=[(float(v) for v in k.strip().split()) for k in dataList]
dataList=[(1.0,)+tuple(k) for k in dataList]
return dataList def test(dataList, w):
test_error=0 def sign(item):
s=0
for k in range(L+1):
s+=w[k]*item[k]
if(s>0):return 1
else:return -1 for item in dataList:
value=sign(item)
if(value!=item[-1]):
test_error+=1 error_rate=test_error/len(dataList)
return error_rate #训练过程
def train(train_data, test_data):
train_time=0
w_best=[0]*(L+1)
w_candidate=[0]*(L+1) def sign(item, w):
s=0
for k in range(L+1):
s+=w[k]*item[k]
if(s>0):return 1
else:return -1 def w_change(item):
nonlocal w_candidate
for k in range(L+1):
w_candidate[k]+=item[k]*item[-1] error_1=test(train_data, w_best) while(True):
for item in train_data:
value=sign(item, w_candidate)
if(value!=item[-1]):
w_change(item)
train_time+=1 error_2=test(train_data, w_candidate)
if(error_2<error_1):
w_best=copy.copy(w_candidate)
error_1=error_2 if(train_time==50):
return w_best if __name__=="__main__":
train_data=dataLoad(url_1) #train_data
test_data=dataLoad(url_2) #train_data error=[] for i in range(2000):
"打乱顺序"
random.shuffle(train_data)
w=train(train_data, test_data)
e=test(test_data, w)
print("第", i, "次实验,误差:", e)
error.append(e)
print(sum(error)/2000)

为了更好的理解 Packet 方法, 下面给出权重更新的部分过程:
第 370 次实验,误差: 0.154
error_1 0.39
error_2 0.61
error_2 0.346
error_2 0.39
error_2 0.374
error_2 0.61
error_2 0.316
error_2 0.61
error_2 0.364
error_2 0.608
error_2 0.212
error_2 0.604
error_2 0.186
error_2 0.61
error_2 0.264
error_2 0.388
error_2 0.14
error_2 0.526
error_2 0.332
error_2 0.332
error_2 0.368
error_2 0.422
error_2 0.226
error_2 0.564
error_2 0.224
error_2 0.478
error_2 0.246
error_2 0.386
error_2 0.204
error_2 0.422
error_2 0.264
error_2 0.262
error_2 0.264
error_2 0.434
error_2 0.226
error_2 0.53
error_2 0.234
error_2 0.39
error_2 0.232
error_2 0.418
error_2 0.2
error_2 0.48
error_2 0.21
error_2 0.542
error_2 0.234
error_2 0.538
error_2 0.232
error_2 0.558
error_2 0.25
error_2 0.466
error_2 0.332
第 371 次实验,误差: 0.138
error_1 0.39
error_2 0.61
error_2 0.448
error_2 0.39
error_2 0.348
error_2 0.61
error_2 0.382
error_2 0.602
error_2 0.326
error_2 0.488
error_2 0.3
error_2 0.526
error_2 0.164
error_2 0.61
error_2 0.21
error_2 0.61
error_2 0.262
error_2 0.61
error_2 0.19
error_2 0.604
error_2 0.252
error_2 0.556
error_2 0.176
error_2 0.572
error_2 0.208
error_2 0.5
error_2 0.252
error_2 0.454
error_2 0.228
error_2 0.378
error_2 0.61
error_2 0.388
error_2 0.334
error_2 0.386
error_2 0.26
error_2 0.516
error_2 0.244
error_2 0.374
error_2 0.298
error_2 0.248
error_2 0.372
error_2 0.156
error_2 0.602
error_2 0.128
error_2 0.382
error_2 0.138
error_2 0.38
error_2 0.11
error_2 0.568
error_2 0.142
error_2 0.588
第 372 次实验,误差: 0.106
第 19题:
#!/usr/bin/env python3
#encoding:UTF-8
import random
import copy
import urllib.request L=4
url_1="https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_math/hw1_18_train.dat"
url_2="https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_math/hw1_18_test.dat" "数据读入"
def dataLoad(url):
repones=urllib.request.urlopen(url)
dataList=repones.readlines()
dataList=[(float(v) for v in k.strip().split()) for k in dataList]
dataList=[(1.0,)+tuple(k) for k in dataList]
return dataList def test(dataList, w):
test_error=0 def sign(item):
s=0
for k in range(L+1):
s+=w[k]*item[k]
if(s>0):return 1
else:return -1 for item in dataList:
value=sign(item)
if(value!=item[-1]):
test_error+=1 error_rate=test_error/len(dataList)
return error_rate #训练过程
def train(train_data):
train_time=0
w_best=[0]*(L+1)
w_candidate=[0]*(L+1) def sign(item, w):
s=0
for k in range(L+1):
s+=w[k]*item[k]
if(s>0):return 1
else:return -1 def w_change(item):
nonlocal w_candidate
for k in range(L+1):
w_candidate[k]+=item[k]*item[-1] #error_1=test(train_data, w_best)
#print("error_1", error_1)
while(True):
for item in train_data:
value=sign(item, w_candidate)
if(value!=item[-1]):
w_change(item)
train_time+=1 #error_2=test(train_data, w_candidate)
#print("error_2", error_2)
#if(error_2<error_1):
# w_best=copy.copy(w_candidate)
# error_1=error_2 if(train_time==50):
#return w_best
return w_candidate if __name__=="__main__":
train_data=dataLoad(url_1) #train_data
test_data=dataLoad(url_2) #train_data error=[] for i in range(2000):
"打乱顺序"
random.shuffle(train_data)
w=train(train_data)
e=test(test_data, w)
print("第", i, "次实验,误差:", e)
error.append(e)
print(sum(error)/2000)

答案和 网上C++版的不太一样,那一版是0.27。
问题在哪,不知道,还在寻找中。
经过比对,最终找出了原因, c++版只进行了49次修正,而我写的是进行了50次修正,修改如下:

不随机情况下,Python 版结果:

C++ 版:

可以看到其结果大致相同, 错误排除成功。
第20题, 修改修正次数:
#!/usr/bin/env python3
#encoding:UTF-8
import random
import copy
import urllib.request L=4
url_1="https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_math/hw1_18_train.dat"
url_2="https://www.csie.ntu.edu.tw/~htlin/mooc/datasets/mlfound_math/hw1_18_test.dat" "数据读入"
def dataLoad(url):
repones=urllib.request.urlopen(url)
dataList=repones.readlines()
dataList=[(float(v) for v in k.strip().split()) for k in dataList]
dataList=[(1.0,)+tuple(k) for k in dataList]
return dataList def test(dataList, w):
test_error=0 def sign(item):
s=0
for k in range(L+1):
s+=w[k]*item[k]
if(s>0):return 1
else:return -1 for item in dataList:
value=sign(item)
if(value!=item[-1]):
test_error+=1 error_rate=test_error/len(dataList)
return error_rate #训练过程
def train(train_data, test_data):
train_time=0
w_best=[0]*(L+1)
w_candidate=[0]*(L+1) def sign(item, w):
s=0
for k in range(L+1):
s+=w[k]*item[k]
if(s>0):return 1
else:return -1 def w_change(item):
nonlocal w_candidate
for k in range(L+1):
w_candidate[k]+=item[k]*item[-1] error_1=test(train_data, w_best) while(True):
for item in train_data:
value=sign(item, w_candidate)
if(value!=item[-1]):
w_change(item)
train_time+=1 error_2=test(train_data, w_candidate)
if(error_2<error_1):
w_best=copy.copy(w_candidate)
error_1=error_2 if(train_time==100):
return w_best if __name__=="__main__":
train_data=dataLoad(url_1) #train_data
test_data=dataLoad(url_2) #train_data error=[] for i in range(2000):
"打乱顺序"
random.shuffle(train_data)
w=train(train_data, test_data)
e=test(test_data, w)
print("第", i, "次实验,误差:", e)
error.append(e)
print(sum(error)/2000)
结果:

機器學習基石 机器学习基石(Machine Learning Foundations) 作业1 习题解答 (续)的更多相关文章
- 機器學習基石(Machine Learning Foundations) 机器学习基石 课后习题链接汇总
大家好,我是Mac Jiang,非常高兴您能在百忙之中阅读我的博客!这个专题我主要讲的是Coursera-台湾大学-機器學習基石(Machine Learning Foundations)的课后习题解 ...
- 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 课后习题解答
今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业三的习题解答.笔者在做这些题目时遇到非常多困难,当我在网上寻找答案时却找不到,而林 ...
- 機器學習基石 (Machine Learning Foundations) 作业1 Q15-17的C++实现
大家好,我是Mac Jiang.今天和大家分享Coursera-台湾大学-機器學習基石 (Machine Learning Foundations) -作业1的Q15-17题的C++实现. 这部分作业 ...
- 機器學習基石(Machine Learning Foundations) 机器学习基石 作业四 Q13-20 MATLAB实现
大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业四 Q13-20的MATLAB实现. 曾经的代码都 ...
- 機器學習基石 机器学习基石 (Machine Learining Foundations) 作业2 Q16-18 C++实现
大家好,我是Mac Jiang,今天和大家分享Coursera-NTU-機器學習基石(Machine Learning Foundations)-作业2 Q16-18的C++实现.尽管有非常多大神已经 ...
- 機器學習基石 机器学习基石(Machine Learning Foundations) 作业2 第10题 解答
由于前面分享的几篇博客已经把其他题的解决方法给出了链接,而这道题并没有,于是这里分享一下: 原题: 这题说白了就是求一个二维平面上的数据用决策树来分开,这就是说平面上的点只能画横竖两个线就要把所有的点 ...
- 我在 B 站学机器学习(Machine Learning)- 吴恩达(Andrew Ng)【中英双语】
我在 B 站学机器学习(Machine Learning)- 吴恩达(Andrew Ng)[中英双语] 视频地址:https://www.bilibili.com/video/av9912938/ t ...
- 机器学习(Machine Learning)
机器学习(Machine Learning)是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能的学科.
- Domain adaptation:连接机器学习(Machine Learning)与迁移学习(Transfer Learning)
domain adaptation(域适配)是一个连接机器学习(machine learning)与迁移学习(transfer learning)的新领域.这一问题的提出在于从原始问题(对应一个 so ...
随机推荐
- makefile中的word函数作用是什么
答:用来取单词的函数,示例如下: $(word 1,hello jello yello) 上面的语句执行后的结果为hello,意为取字符串的第一个单词
- sickit-learn库实现机器学习
sickit-learn库实现机器学习 [TOC] Iris数据集 from sklearn import datasets iris=datasets.load_iris() # 数据 iris.d ...
- LA 5846 霓虹灯广告牌(单色三角形问题)
https://vjudge.net/problem/UVALive-5846 题意: 圆周上有n个点,两两相连,只能涂红色或蓝色.求单色三角形的个数. 思路: 这个问题在训练指南105页有详细讲解. ...
- Row_Number() over( PARTITION By cno ...)
转自:https://blog.csdn.net/qq_25237107/article/details/644429691.在 MSSQL,oracle 有partition by 的用法creat ...
- java的时间获取
System类代表系统,系统级的很多属性和控制方法都放置在该类的内部.该类位于java.lang包. currentTimeMillis方法 public static long currentTim ...
- 一致性hash演示
看到点关于一致性hash的说明,觉得挺有意思,就想体验一下. 上代码看看,体会一下在一致性hash环境下的cache和获取. 因为是小代码演示,没有很细致,包括hash函数就是用取余操作,但活生生的显 ...
- MySQL表类型MyISAM/InnoDB的区别(解决事务不回滚的问题)
MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...
- CTR的贝叶斯平滑
参考论文: Click-Through Rate Estimation for Rare Events in Online Advertising 参考的博客: 1.https://jiayi797. ...
- nginx页面不能正常访问排除方法
nginx页面不能访问 nginx页面不能访问 检查服务端服务是否启动成功 在服务端使用wget和curl测试下返回的是否正常 浏览器wget或者curl等软件访问不了Ngixn页面 1. 检查服务端 ...
- CentOS7 LVM添加硬盘及扩容
一.LVM简介 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制.LVM将一个或多个磁盘分区(PV)虚拟为一个卷组(VG), ...