机器学习基石笔记:Homework #1 PLA&PA相关习题
原文地址:http://www.jianshu.com/p/5b4a64874650
问题描述


程序实现
# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
import time
def read_data(dataFile):
with open(dataFile, 'r') as file:
data_list = []
for line in file.readlines():
line = line.strip().split()
# add x0=1.0
data_list.append([1.0] + [float(l) for l in line])
num_data = len(data_list)
data_array = np.array(data_list)
return (num_data,data_array)
def sign(n):
if(n>0):
return 1
else:
return -1
# define PLA class
class PLA(object):
def __init__(self,num_data,data_array,training_epochs=2000,ita=1.0,qID=15):
self.num_data=num_data
self.data_array=data_array
self.training_epochs=training_epochs
self.ita=ita
self.qID=qID
def train(self,w=np.zeros([5])):
self.update_counts_list=[]
self.last_error_id_list=[]
for k in range(self.training_epochs):
if self.training_epochs==1:
id_array=np.array([m for m in range(self.num_data)])
else:
np.random.seed(k)
id_array = np.random.permutation([m for m in range(self.num_data)])
update_counts = 0
total_counts = 0
self.w=np.array(w)
id = 0
error_point_id = -1
while (total_counts <= self.num_data):
g = 0
g += np.dot(self.w, self.data_array[id_array[id]][:5])
if sign(g) == self.data_array[id_array[id]][5]:
total_counts += 1
else:
self.w += self.ita*self.data_array[id_array[id]][5] * self.data_array[id_array[id]][:5]
error_point_id = id_array[id]
update_counts += 1
total_counts = 0
id += 1
id = id % self.num_data
self.update_counts_list.append(update_counts)
self.last_error_id_list.append(error_point_id)
return
def show_results(self):
print("\n",self.qID,"...")
print("training:")
if self.training_epochs==1:
print("the number of updates: ", self.update_counts_list[0])
print("the final error point id: ", self.last_error_id_list[0])
print("-----------------------")
return
else:
print("the list of update counts: ",self.update_counts_list)
print("the list of last error point id: ",self.last_error_id_list)
print("the average number of updates:", sum(self.update_counts_list) / self.training_epochs)
print("-----------------------")
plt.figure()
plt.hist(self.update_counts_list)
plt.xlabel("the number of updates")
plt.ylabel("frequency")
plt.title(self.qID)
plt.savefig("%s_train.png"%self.qID)
return
def total_error_counts(w,data_array,num_data):
total_error_counts=0
for i in range(num_data):
if sign(np.dot(w, data_array[i][:5])) != data_array[i][5]:
total_error_counts+=1
return total_error_counts
# define PA class
class PA(PLA):
def __init__(self,num_data,data_array,num_test,test_array,
training_epochs=2000,given_updates=50,ita=1.0,pla_flag=False,qID=18):
PLA.__init__(self,num_data,data_array,training_epochs,ita,qID)
self.num_test=num_test
self.test_array=test_array
self.given_updates=given_updates
self.pla_flag=pla_flag
def train_and_test(self,w=np.zeros([5])):
self.last_error_id_list=[]
self.test_error_rate_list=[]
for k in range(self.training_epochs):
# train
if self.training_epochs==1:
id_array=np.array([m for m in range(self.num_data)])
else:
np.random.seed(k)
id_array = np.random.permutation([m for m in range(self.num_data)])
update_counts = 0
id = 0
self.pocket_w = np.array(w) # create a copy of w and give it to self.w
w=np.array(w)
error_point_id = -1
while (update_counts <= self.given_updates):
g = 0
g += np.dot(w, self.data_array[id_array[id]][:5])
if sign(g) != self.data_array[id_array[id]][5]:
w += self.ita*self.data_array[id_array[id]][5] * self.data_array[id_array[id]][:5]
if(self.pla_flag or (total_error_counts(w,self.data_array,self.num_data)<total_error_counts(self.pocket_w,self.data_array,self.num_data))):
self.pocket_w=np.array(w)
error_point_id = id_array[id]
update_counts += 1
id += 1
id = id % self.num_data
self.last_error_id_list.append(error_point_id)
# test
self.test_error_rate_list.append(total_error_counts(self.pocket_w, self.test_array, self.num_test)
/ self.num_test)
return
def show_results(self):
print("\n",self.qID,"...")
print("training:")
if self.training_epochs==1:
print("the final error point id: ", self.last_error_id_list[0])
else:
print("the list of last error point id: ",self.last_error_id_list)
print("testing:")
print("the average error rate on test set: ",np.sum(self.test_error_rate_list)/self.training_epochs)
print("-----------------------")
plt.figure()
plt.hist(self.test_error_rate_list)
plt.xlabel("error rate")
plt.ylabel("frequency")
plt.title(self.qID)
plt.savefig("%s_test.png"%self.qID)
return
if __name__=="__main__":
num_data,data_array=read_data("hw1_15_train.dat")
# 15
pla_15=PLA(num_data,data_array,training_epochs=1,qID=15)
pla_15.train()
pla_15.show_results()
# 16
pla_16=PLA(num_data,data_array,qID=16)
pla_16.train()
pla_16.show_results()
# 17
pla_17=PLA(num_data,data_array,ita=0.5,qID=17)
pla_17.train()
pla_17.show_results()
# 16 else 1
pla_16_1=PLA(num_data,data_array,qID=161)
pla_16_1.train(w=np.array([1.0,0,0,0,0]))
pla_16_1.show_results()
# 17 else 1
pla_17_1=PLA(num_data,data_array,ita=0.5,qID=171)
pla_17_1.train(w=np.array([1.0,0,0,0,0]))
pla_17_1.show_results()
num_data,data_array=read_data("hw1_18_train.dat")
num_test,test_array=read_data("hw1_18_test.dat")
# 18
pa_18=PA(num_data,data_array,num_test,test_array,qID=18)
start = time.time()
pa_18.train_and_test()
end=time.time()
print("total time for train and test of 18: ",end-start," s")
pa_18.show_results()
# 19
pa_19=PA(num_data,data_array,num_test,test_array,pla_flag=True,qID=19)
start=time.time()
pa_19.train_and_test()
end=time.time()
print("total time for train and test of 19: ",end-start," s")
pa_19.show_results()
# 20
pa_20=PA(num_data,data_array,num_test,test_array,given_updates=100,qID=20)
pa_20.train_and_test()
pa_20.show_results()
# 18 else 1
pa_18_1=PA(num_data,data_array,num_test,test_array,qID=181)
pa_18_1.train_and_test(w=np.array([1.0,0,0,0,0]))
pa_18_1.show_results()
# 20 else 1
pa_20_1=PA(num_data,data_array,num_test,test_array,given_updates=100,qID=201)
pa_20_1.train_and_test(w=np.array([1.0,0,0,0,0]))
pa_20_1.show_results()
运行结果及分析
15

16


17


对比16与17的结果:
16中步长1.0,17中步长0.5,看似步长对更新次数无影响?
16.1


17.1


对比16.1与17.1的结果:
16.1中步长1.0,17.1中步长0.5,可见步长对更新次数有影响;
再看16 vs 16.1、17 vs 17.1,前者\(W\)初始值[0,0,0,0,0],后者\(W\)初始值[1,0,0,0,0],可见\(W\)初始值对更新次数有影响。
18


19


对比18与19的结果:
可见PA(18)速度明显慢于PLA(19);但在数据线性不可分的情况下,PA表现比PLA好。
20


18.1


20.1


分别对比18与20、18.1与20.1、18与18.1、20与20.1的结果:
结论与PLA处类似,
W初始值、更新步长对分类器表现有影响。
机器学习基石笔记:Homework #1 PLA&PA相关习题的更多相关文章
- 机器学习基石笔记:11 Linear Models for Classification
一.二元分类的线性模型 线性分类.线性回归.逻辑回归: 可视化这三个线性模型的代价函数, SQR.SCE的值都是大于等于0/1的. 理论分析上界: 将回归应用于分类: 线性回归后的参数值常用于pla/ ...
- 机器学习基石笔记:11 Linear Models for Classification、LC vs LinReg vs LogReg、OVA、OVO
原文地址:https://www.jianshu.com/p/6f86290e70f9 一.二元分类的线性模型 线性回归后的参数值常用于PLA/PA/Logistic Regression的参数初始化 ...
- 机器学习基石笔记:02 Learning to Answer Yes/No、PLA、PA
原文地址:https://www.jianshu.com/p/ed0aee74523f 一.Perceptron Learning Algorithm (一)算法原理 PLA本质是二元线性分类算法,即 ...
- 机器学习基石笔记:Homework #2 decision stump相关习题
原文地址:http://www.jianshu.com/p/4bc01760ac20 问题描述 程序实现 17-18 # coding: utf-8 import numpy as np import ...
- 机器学习基石笔记:Homework #4 Regularization&Validation相关习题
原文地址:https://www.jianshu.com/p/3f7d4aa6a7cf 问题描述 程序实现 # coding: utf-8 import numpy as np import math ...
- 机器学习基石笔记:Homework #3 LinReg&LogReg相关习题
原文地址:http://www.jianshu.com/p/311141f2047d 问题描述 程序实现 13-15 # coding: utf-8 import numpy as np import ...
- 机器学习基石:Homework #0 SVD相关&常用矩阵求导公式
- 机器学习基石笔记:03 Types of Learning
原文地址:https://www.jianshu.com/p/86b2a9cef742 一.学习的分类 根据输出空间\(Y\):分类(二分类.多分类).回归.结构化(监督学习+输出空间有结构): 根据 ...
- 机器学习基石笔记:08 Noise and Error
噪声:误标.对同一数据点的标注不一致.数据点信息不准确...... 噪声是针对整个输入空间的. 存在噪声的情况下,VC bound依旧有用: 存在噪声,就是f------>p(y|x),f是p的 ...
随机推荐
- 工具系列-idea破解
>>>>>>>>>>>>>>>>>>>>>>>>> ...
- js实现页面重新加载
https://blog.csdn.net/wangjian530/article/details/80596801
- 记录几个爬取动态网页时的问题(下拉框,旧的元素无法获取,获取的源代码和f12看到的不一致,爬取延迟)
更新.....这个动态网页其实直接抓取ajax请求就可以了,很简单,我之前想复杂了,虽然也实现了,但是效率极低,不过没关系,就当作是对Selenium的一次学习吧 1.最近在爬取一个动态网页,其中为了 ...
- 使用 Swoole 来加速 Laravel应用
Swoole 是为 PHP 开发的生产级异步编程框架. 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 TCP, UDP, Unix socket, HTT ...
- 爬虫之图片懒加载技术及js加密
图片懒加载 图片懒加载概念: 图片懒加载是一种网页优化技术.图片作为一种网络资源,在被请求时也与普通静态资源一样,将占用网络资源,而一次性将整个页面的所有图片加载完,将大大增加页面的首屏加载时间.为了 ...
- PHP中获取某个网页或文件内容的方法
1. 通过file_get_contents()函数$contents = file_get_contents('http://demo.com/index.php');echo $contents; ...
- hadoop2-MapReduce详解
本文是对Hadoop2.2.0版本的MapReduce进行详细讲解.请大家要注意版本,因为Hadoop的不同版本,源码可能是不同的. 以下是本文的大纲: 1.获取源码2.WordCount案例分析3. ...
- myeclipse中配置自己安装的Tomcat
myeclipse中配置自己安装的Tomcat 在myeclipse中配置好jdk,Tomcat之后,如果是web项目需要部署运行,但在部署时发现配置好的Tomcat没有显示,只显示了myeclips ...
- javascript函数传值问题(传值?址)
通常对于我们开发者来说,有不少人是忽略了这些小问题的,但是我们又必要去了解.因为今天一个朋友问起,所以写到这里来了, 在C#中,我们知道如果要往一个函数中传递参数的类型为对象,数组或者其他引用类型时. ...
- 初学angular项目中遇到的一些问题
1.当angular渲染完成后操作DOM树方法 //当数据渲染完毕 ngApp.directive('repeatFinish', function () { return { ...