機器學習基石 机器学习基石(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 ...
随机推荐
- POJ_1703 并查集应用
通过这题基本完整理解了并查集的构建和使用.很轻巧的一种数据结构. 本题的方法值得注意:并没有直接构建两个帮派的集合,而是构建: 关系确认集合+若干单元素集(也即未确认帮派的初始状态)并辅助一个rel数 ...
- 分词工具比较及使用(ansj、hanlp、jieba)
一.分词工具 ansj.hanlp.jieba 二.优缺点 1.ansj 优点: 提供多种分词方式 可直接根据内部词库分出人名.机构等信息 可构造多个词库,在分词时可动态选择所要使用的词库缺点: 自定 ...
- [WCF安全3]使用wsHttpBinding构建基于SSL与UserName授权的WCF应用程序
上一篇文章中介绍了如何使用wsHttpBinding构建UserName授权的WCF应用程序,本文将为您介绍如何使用wsHttpBinding构建基于SSL的UserName安全授权的WCF应用程序. ...
- java自带的MD5
前言: MD5可生成16.32.64位数的签名. // MD5加码,32位 public static String toMD5(String plainText) { String r ...
- R语言系列:自定义function
在用R语言做各种事物时,用户自定义函数是不可或缺的.这期来讲讲如何自定义R的function.首先要介绍的是function的基本框架: myfunction <- function(arg1, ...
- 解压.zip,.tar.gz文件到指定目录,重命名文件
1.解压文件到指定目录 /** * 解压文件到指定目录 * zipFile:要解压的文件 * descDir:解压到哪个文件 * */ @SuppressWarnings("rawtypes ...
- Centos 解决 No package htop available.
yum install -y epel-release 之后就可以安装 yum install -y htop 什么是EPEL? EPEL的全称叫 Extra Packages for Enterpr ...
- Mysql之explain调优
Explain调优 使用explain语法,对SQL进行解释,根据其结果进行调优: MySQL 表关联的算法是 Nest Loop Join,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该 ...
- 常数PK系列汇总
常数PK系列说明: 在AC的情况下得分=\(\sum_{i=1}^{10}{1000-runtime\_on\_point_i}\) RE会显示UKE UPD:之前的数据太水,导致好多题都在9000分 ...
- Linux命令详解-rmdir
rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删除某目录时也必须具有对父目录的写权限. 1.命令 ...