热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

统计学习方法之感知机python代码实现

感知机是二分类线性模型,其输入为实例的特征向量,输出为实例的类别,取1和-1。根据《统计学习方法》第2章,用python实

感知机是二分类线性模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1。

根据《统计学习方法》第2章,用python实现感知机。

import numpy as np
import matplotlib.pyplot as pltclass Perceptron:def __init__(self, dim):""" 初始化权重 w b 以及x特征的维度dim"""self.w &#61; np.random.random((dim,))self.b &#61; np.random.rand()self.dim &#61; dimdef f(self, x):""" w * x &#43; b"""return np.dot(self.w, x.T) &#43; self.bdef gw(self, x, y):""" w梯度 """return x * ydef gb(self, y):""" b梯度"""return ydef train_2(self, xs, ys, alpha&#61;1, max_step&#61;1000):"""学习算法的对偶形式"""n &#61; len(xs)matrix &#61; np.zeros((n,n),dtype&#61;int)for i in range(n):for j in range(n):matrix[i][j] &#61; np.dot(xs[i],xs[j])print("matrix:", matrix)a, b &#61; [0]*n, 0step &#61; 1error &#61; float("inf")while error and step < max_step:print("step: {}, error: {}".format(step, error))error &#61; 0for i,(x, y) in enumerate(zip(xs, ys)):sum_ &#61; bfor j in range(n):sum_ &#43;&#61; a[j]*ys[j]*matrix[j][i]if y*sum_ <&#61; 0:a[i] &#61; a[i] &#43; alphab &#43;&#61; alpha * yerror &#43;&#61; 1step &#43;&#61; 1self.w &#61; sum(a[i]*xs[i]*ys[i] for i in range(n))self.b &#61; bif step >&#61; max_step:print("max_step limit")else:print("successfully learn")print("w: {} b: {}".format(self.w, self.b))def train(self, xs, ys, alpha&#61;0.1, max_step&#61;1000):"""学习算法:param xs: 输入样本特征:param ys: 样本分类:param alpha: 学习率:param max_step: 最大迭代伦次:return:"""# 输入数据维度要等于指定维度(画图只能是二维)if xs.shape[1] !&#61; self.dim:raise ValueError("x sample must {} dim".format(self.dim))# 初始化图fig &#61; self.figure_init(xs, ys)error &#61; float("inf")step &#61; 1while error and step < max_step:print("step: {}, error: {}".format(step, error))error &#61; 0for x, y in zip(xs, ys):if self.f(x) * y <&#61; 0:self.w &#43;&#61; alpha * self.gw(x, y)self.b &#43;&#61; alpha * self.gb(y)self.figure_update(fig) # 更新图error &#43;&#61; 1step &#43;&#61; 1if step >&#61; max_step:print("max_step limit")else:print("successfully learn")print("w: {} b: {}".format(self.w, self.b))# 关闭交互模式plt.ioff()# 图形显示plt.show()def figure_init(self, xs, ys):fig &#61; plt.figure(figsize&#61;(8, 6), dpi&#61;80)ax &#61; fig.add_subplot(1, 1, 1)# 设定标题等plt.title("Perceptron")plt.grid(True)# 设置X轴plt.xlabel("x(1)")plt.xlim(-10, 10)# 设置Y轴plt.ylabel("x(2)")plt.ylim(-10, 10)# 画点for x_, y_ in zip(xs, ys):if y_ &#61;&#61; 1:ax.plot(x_[0], x_[1], "ro")else:ax.plot(x_[0], x_[1], "go")# 生成超平面 w1 * x1 &#43; w2 * x2 &#43; b &#61; 0&#xff0c;随机取两个x1&#xff0c;计算x2连起来x1 &#61; np.linspace(-10, 10, 2, endpoint&#61;True)x2 &#61; (- self.b - self.w[0] * x1) / self.w[1]# 画直线lines &#61; ax.plot(x1, x2, "b-", linewidth&#61;2.0, label&#61;"hyperplane")# 设置图例位置,loc可以为[upper, lower, left, right, center]ax.legend(loc&#61;"upper left", shadow&#61;True)# 暂停plt.pause(0.5)ax.lines.remove(lines[0])# 打开交互模式plt.ion()return axdef figure_update(self, ax):"""画图程序&#xff0c;每更新一次权重&#xff0c;调用一次"""# 生成超平面 w1 * x1 &#43; w2 * x2 &#43; b &#61; 0&#xff0c;随机取两个x1&#xff0c;计算x2连起来x1 &#61; np.linspace(-10, 10, 2, endpoint&#61;True)x2 &#61; (- self.b - self.w[0]*x1)/self.w[1]# 更新直线lines &#61; ax.plot(x1, x2, "b-", linewidth&#61;2.0, label&#61;"hyperplane")# 暂停plt.pause(0.5)# 删掉直线ax.lines.remove(lines[0])p &#61; Perceptron(2)
x_data &#61; np.array([[3, 3], [4, 3], [1, 1]])
y_data &#61; np.array([1, 1, -1])
p.train(x_data, y_data)
# p.train_2(x_data, y_data)

其中&#xff0c;train函数是学习算法的原始形式&#xff0c;train_2是学习算法的对偶形式。其中error代表误分类的个数&#xff0c;简单的逻辑就是&#xff0c;当误分类的个数为0或者超出最大学习轮次则停止学习。

另外&#xff0c;figrue_init 和 figure_update函数则是在训练过程的图形展示。

推荐阅读
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
  • #点球小游戏fromrandomimportchoiceimporttimescore[0,0]direction[left,center,right]defkick() ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 开发笔记:2020 BJDCTF Re encode
    开发笔记:2020 BJDCTF Re encode ... [详细]
author-avatar
2369698942_813453_754
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有