热门标签 | 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函数则是在训练过程的图形展示。

推荐阅读
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文介绍了200个经典c语言源代码,包括函数的使用,如sqrt函数、clanguagefunct等。这些源代码可以帮助读者更好地理解c语言的编程方法,并提供了实际应用的示例。 ... [详细]
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社区 版权所有