感知器属于机器学习的入门算法了,具体的理论知识不细讲了。只说下里面涉及到的核心知识:

权重更新公式:w=wi+▲wi          b=b+▲b其中▲wi=n(t-y)x   b=n(t-y)

n是学习效率,t是label即真实的输出,y是感知器的输出值。我现阶段认为机器学习最重要的是建立模型对模型进行训练。我们建立模型。代码如下:

def train(self, input_vecs, labels, iteration, rate):"""输入训练数据:一组向量、与每个向量对应的label;以及训练轮数、学习率"""for i in range(iteration):self._one_iteration(input_vecs, labels, rate)def _one_iteration(self, input_vecs, labels, rate):"""一次迭代,把所有的训练数据过一遍"""# 把输入和输出打包在一起,成为样本的列表[(input_vec, label), ...]# 而每个训练样本是(input_vec, label)samples = zip(input_vecs, labels)# 对每个样本,按照感知器规则更新权重for (input_vec, label) in samples:# 计算感知器在当前权重下的输出output = self.predict(input_vec)# 更新权重self._update_weights(input_vec, output, label, rate)def _update_weights(self, input_vec, output, label, rate):"""按照感知器规则更新权重"""# 首先计算本次更新的delta# 然后把input_vec[x1,x2,x3,...]向量中的每个值乘上delta,得到每个权重更新# 最后再把权重更新按元素加到原先的weights[w1,w2,w3,...]上delta = label - outputself.weights = VectorOp.element_add(self.weights, VectorOp.scala_multiply(input_vec, rate * delta))# 更新biasself.bias += rate * delta

模型建立好并训练好之后就可以使用该模型对数据进行预测了。该段代码实现的功能是真值表的与运算。整段代码如下(python3):

#!/usr/bin/env python
# -*- coding: UTF-8 -*-from __future__ import print_function
from functools import reduceclass VectorOp(object):"""实现向量计算操作"""@staticmethoddef dot(x, y):"""计算两个向量x和y的内积"""# 首先把x[x1,x2,x3...]和y[y1,y2,y3,...]按元素相乘# 变成[x1*y1, x2*y2, x3*y3]# 然后利用reduce求和return reduce(lambda a, b: a + b, VectorOp.element_multiply(x, y), 0.0)@staticmethoddef element_multiply(x, y):"""将两个向量x和y按元素相乘"""# 首先把x[x1,x2,x3...]和y[y1,y2,y3,...]打包在一起# 变成[(x1,y1),(x2,y2),(x3,y3),...]# 然后利用map函数计算[x1*y1, x2*y2, x3*y3]return list(map(lambda x_y: x_y[0] * x_y[1], zip(x, y)))@staticmethoddef element_add(x, y):"""将两个向量x和y按元素相加"""# 首先把x[x1,x2,x3...]和y[y1,y2,y3,...]打包在一起# 变成[(x1,y1),(x2,y2),(x3,y3),...]# 然后利用map函数计算[x1+y1, x2+y2, x3+y3]return list(map(lambda x_y: x_y[0] + x_y[1], zip(x, y)))@staticmethoddef scala_multiply(v, s):"""将向量v中的每个元素和标量s相乘"""return map(lambda e: e * s, v)class Perceptron(object):def __init__(self, input_num, activator):"""初始化感知器,设置输入参数的个数,以及激活函数。激活函数的类型为double -> double"""self.activator = activator# 权重向量初始化为0self.weights = [0.0] * input_num# 偏置项初始化为0self.bias = 0.0def __str__(self):"""打印学习到的权重、偏置项"""return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)def predict(self, input_vec):"""输入向量,输出感知器的计算结果"""# 计算向量input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]的内积# 然后加上biasreturn self.activator(VectorOp.dot(input_vec, self.weights) + self.bias)def train(self, input_vecs, labels, iteration, rate):"""输入训练数据:一组向量、与每个向量对应的label;以及训练轮数、学习率"""for i in range(iteration):self._one_iteration(input_vecs, labels, rate)def _one_iteration(self, input_vecs, labels, rate):"""一次迭代,把所有的训练数据过一遍"""# 把输入和输出打包在一起,成为样本的列表[(input_vec, label), ...]# 而每个训练样本是(input_vec, label)samples = zip(input_vecs, labels)# 对每个样本,按照感知器规则更新权重for (input_vec, label) in samples:# 计算感知器在当前权重下的输出output = self.predict(input_vec)# 更新权重self._update_weights(input_vec, output, label, rate)def _update_weights(self, input_vec, output, label, rate):"""按照感知器规则更新权重"""# 首先计算本次更新的delta# 然后把input_vec[x1,x2,x3,...]向量中的每个值乘上delta,得到每个权重更新# 最后再把权重更新按元素加到原先的weights[w1,w2,w3,...]上delta = label - outputself.weights = VectorOp.element_add(self.weights, VectorOp.scala_multiply(input_vec, rate * delta))# 更新biasself.bias += rate * deltadef f(x):"""定义激活函数f"""return 1 if x > 0 else 0def get_training_dataset():"""基于and真值表构建训练数据"""# 构建训练数据# 输入向量列表input_vecs = [[1, 1], [0, 0], [1, 0], [0, 1]]# 期望的输出列表,注意要与输入一一对应# [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0labels = [1, 0, 0, 0]return input_vecs, labelsdef train_and_perceptron():"""使用and真值表训练感知器"""# 创建感知器,输入参数个数为2(因为and是二元函数),激活函数为fp = Perceptron(2, f)# 训练,迭代10轮, 学习速率为0.1input_vecs, labels = get_training_dataset()p.train(input_vecs, labels, 10, 0.1)# 返回训练好的感知器return pif __name__ == '__main__':# 训练and感知器and_perception = train_and_perceptron()# 打印训练获得的权重print(and_perception)# 测试print('1 and 1 = %d' % and_perception.predict([1, 1]))print('0 and 0 = %d' % and_perception.predict([0, 0]))print('1 and 0 = %d' % and_perception.predict([1, 0]))print('0 and 1 = %d' % and_perception.predict([0, 1]))

参考资料:https://www.zybuluo.com/hanbingtao/note/433855

感知器python代码相关推荐

  1. OpenCV 多层感知器训练代码示例

    代码参考:https://github.com/mbeyeler/opencv-machine-learning/blob/master/notebooks/09.04-Training-an-MLP ...

  2. 微信运动修改器python代码

    #coding: utf-8#date: 2015年9月29日01:50:37#usage: edit steps and ledongli's uid(u need to download this ...

  3. 深度学习85—[深度学习] 感知器

    感知器 为了理解神经网络,我们应该先理解神经网络的组成单元--神经元.神经元也叫做感知器.感知器算法在上个世纪50-70年代很流行,也成功解决了很多问题.并且,感知器算法也是非常简单的. 感知器的定义 ...

  4. 零基础入门深度学习 | 第一章:感知器

    北京 | 高性能计算之GPU CUDA课程11月24-26日3天密集学习 快速带你晋级阅读全文> 无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作 ...

  5. 深度学习(2) - 感知器

    深度学习是啥 在人工智能领域,有一个方法叫机器学习.在机器学习这个方法里,有一类算法叫神经网络.神经网络如下图所示: 上图中每个圆圈都是一个神经元,每条线表示神经元之间的连接.我们可以看到,上面的神经 ...

  6. (1)Deep Learning之感知器

    What is deep learning? 在人工智能领域,有一个方法叫机器学习.在机器学习这个方法里,有一类算法叫神经网络.神经网络如下图所示: 上图中每个圆圈都是一个神经元,每条线表示神经元之间 ...

  7. 感知器算法(Perceptron)

    目录 引言 感知器 Matlab代码 效果展示 Python代码 效果展示 C++代码 效果展示 引言 本专栏第二个机器学习算法:感知器算法,全部代码通过Github下载,使用Matlab,Pytho ...

  8. 深度学习实战教程(一):感知器

    深度学习是什么 ​ 上图中每个圆圈都是一个神经元,每条线表示神经元之间的连接.我们可以看到,上面的神经元被分成了多层,层与层之间的神经元有连接,而层内之间的神经元没有连接.最左边的层叫做输入层,这层负 ...

  9. 【深度学习】1:感知器原理,以及感知器解决异或问题

    前言: 写完上一篇<KNN算法实现手写数字识别>到现在已经过去了十天,2018年伊始几天同学同事都是各种浪,自己坚持学习实在是痛苦啊! 不悲不气,闲话不多说了,开始自己神经网络的学习旅程吧 ...

最新文章

  1. cisco路由器基本命令配置
  2. 《R语言实战》第2章
  3. CodeForces - 1498D Bananas in a Microwave(思维+dp)
  4. 《Java8实战》笔记(11):CompletableFuture-组合式异步编程
  5. 2021全球自由行报告:我的中国,真好玩!
  6. context:component-scan扫描使用上的容易忽略的use-default-filters
  7. C语言实现的RSA算法程序
  8. 内温的整体优先效应实验_[心理学复习.doc
  9. 获取类路径的方法之一
  10. jqueryui手风琴_jQueryUI手风琴插件
  11. ML-Agents案例之看图配对
  12. 开源实时视频码流分析软件 VideoEye
  13. 将本地数据库中的数据上传到云服务器数据库
  14. 用JS实现人物走动动画效果
  15. CSR8615 蓝牙4.0音响模块
  16. MiniUtilityFramework 九 CText和TEXT
  17. Win键失效,Win+L不起作用了
  18. 如何做一名称职的CEO
  19. dell灵越笔记本后盖怎么拆_戴尔灵越5584笔记本按键拆卸、安装教程
  20. 大败局:知名企业的失败教训

热门文章

  1. 研究生的研究人员发展课程
  2. UNITY 优化之带Animator的Go.SetActive耗时问题,在手机上,这个问题似乎并不存在,因为优化了后手机上运行帧率并未明显提升...
  3. (九)2005年我的第一次软件行业创业,烧掉30万、2年时间打水漂的惨痛教训
  4. method-dispatch/
  5. git 与团队协同开发,避免冲掉别人代码的方法
  6. hdu 4597 Play Game(记忆化搜索)
  7. Delphi XE2 之 FireMonkey 入门(2)
  8. VLAN划分,GVRP还是VTP (此文来自网管员世界)
  9. Scott Mitchell 的ASP.NET 2.0数据教程之二十一:: 实现开放式并发
  10. POJ 3628 Bookshelf 2 (01背包)