原文地址: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相关习题的更多相关文章

  1. 机器学习基石笔记:11 Linear Models for Classification

    一.二元分类的线性模型 线性分类.线性回归.逻辑回归: 可视化这三个线性模型的代价函数, SQR.SCE的值都是大于等于0/1的. 理论分析上界: 将回归应用于分类: 线性回归后的参数值常用于pla/ ...

  2. 机器学习基石笔记:11 Linear Models for Classification、LC vs LinReg vs LogReg、OVA、OVO

    原文地址:https://www.jianshu.com/p/6f86290e70f9 一.二元分类的线性模型 线性回归后的参数值常用于PLA/PA/Logistic Regression的参数初始化 ...

  3. 机器学习基石笔记:02 Learning to Answer Yes/No、PLA、PA

    原文地址:https://www.jianshu.com/p/ed0aee74523f 一.Perceptron Learning Algorithm (一)算法原理 PLA本质是二元线性分类算法,即 ...

  4. 机器学习基石笔记:Homework #2 decision stump相关习题

    原文地址:http://www.jianshu.com/p/4bc01760ac20 问题描述 程序实现 17-18 # coding: utf-8 import numpy as np import ...

  5. 机器学习基石笔记:Homework #4 Regularization&Validation相关习题

    原文地址:https://www.jianshu.com/p/3f7d4aa6a7cf 问题描述 程序实现 # coding: utf-8 import numpy as np import math ...

  6. 机器学习基石笔记:Homework #3 LinReg&LogReg相关习题

    原文地址:http://www.jianshu.com/p/311141f2047d 问题描述 程序实现 13-15 # coding: utf-8 import numpy as np import ...

  7. 机器学习基石:Homework #0 SVD相关&常用矩阵求导公式

  8. 机器学习基石笔记:03 Types of Learning

    原文地址:https://www.jianshu.com/p/86b2a9cef742 一.学习的分类 根据输出空间\(Y\):分类(二分类.多分类).回归.结构化(监督学习+输出空间有结构): 根据 ...

  9. 机器学习基石笔记:08 Noise and Error

    噪声:误标.对同一数据点的标注不一致.数据点信息不准确...... 噪声是针对整个输入空间的. 存在噪声的情况下,VC bound依旧有用: 存在噪声,就是f------>p(y|x),f是p的 ...

随机推荐

  1. SpringMVC是怎么工作的,SpringMVC的工作原理

    SpringWeb MVC 是怎么工作的,SpringMVC的原理,SpringMVC源码 分析. 介绍 SpringWeb MVC是Spring Framework中的一部分,当我们需要使用spri ...

  2. Angular动画——路由动画及高阶动画函数

    一.路由动画 路由动画需要在host元数据中指定触发器.动画注意不要过多,否则适得其反. 内容优先,引导用户去注意到某个内容.动画只是辅助手段. 定义一个进场动画,一个离场动画. 因为进场动画和离场动 ...

  3. Java实现基于token认证

    随着互联网的不断发展,技术的迭代也非常之快.我们的用户认证也从刚开始的用户名密码转变到基于cookie的session认证,然而到了今天,这种认证已经不能满足与我们的业务需求了(分布式,微服务).我们 ...

  4. Entity Framework Core(EF Core) 最简单的入门示例

    目录 概述 基于 .NET Core 的 EF Core 入门 创建新项目 更改当前目录 安装 Entity Framework Core 创建模型 创建数据库 使用模型 基于 ASP.NET Cor ...

  5. python_web框架

    一.web框架 web框架: 自己完成socket的web框架:如,Tornado等 由WSGI完成socket的web框架:如,Django.flash等 两种实现过程: 第二种WSGI方式的,由于 ...

  6. 洛谷 p2678 跳石头 题解

    一道裸的二分答案 如果不会分治的去找dalao吧,本蒟蒻只会二分 不知道二分答案的看这里 这位dalao解释的很详细其实只是随便找了一个 那里面貌似也有这个题的题解,但我还是要写(才不是应付老师) 关 ...

  7. log4j、使用log4j、打印sql日志

    添加pom文件依赖 <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifa ...

  8. window mysql安装

    1.选择下载版本 接着上几篇文章再来看下windows下安装mysql. 我这里是windows7 64位, 安装过程中还是遇到一些坑,这里记录下. 一.下载安装包 打开mysql官网下载页面:htt ...

  9. mysql 8.0 密码加密方式的坑

    问题:新安装好MySQL 8.0和Navicat之后,连接时总是报: 1251 Client does not support authentication protocol requested by ...

  10. 使用ACR122U NFC读卡器对M1卡进行读写操作(可以读写中文)

    因为项目需要,第一次接触到了ACR122U NFC读卡器(非接触式)和M1卡,首先介绍一下想要读写应该知道的基本知识. 我就根据我的理解先叙述一下: ACR122U 是一款连机非接触式智能卡读写器,可 ...