https://blog.dbrgn.ch/2013/3/26/perceptrons-in-python/

 

眼下,我在HSR上參加了一个神经网络和机器学习的课程,当中学习到一个最简单的神经网络模型。就是感知机(perceptronperceptronperceptron)。

 

背景资料

最简单的神经网络的模型就是感知机分类器,它有不同的输入(x1, x2,......xn),然后有不同的权重值(w1, w2,......Wn),例如以下式计算:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FpbW91c2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

每一个相应的权重值与输入值进行相乘,再相加在一起,然后通过一个阶梯函数f:

为了理解整个过程。以下就是它的简化版本号的流程图:

用Python代码来编写

以下是使用Python和NumPy库来编写最简单的感知机。它由两个输入值。接着使用它来学习布尔运算OR的操作,第一步。先导入要使用的库:

from random import choice

from numpy import array, dot, random

接着编写阶梯函数。把它的定义为unit_step:

unit_step = lambda x: 0 if x < 0 else 1

http://reference.wolfram.com/language/ref/UnitStep.html

接着下来编写输入与输出的映射关系的数据。使用Numpy数组来表示。第一个元素是一个三个元素的元组表示,而这个元组的前两个值表示了两个输入值,第三个元素是表示偏差值(主要针对阈值计算),总是使用值1来表示。第二个元素是表示期望输出的值。

这个数组定义例如以下:

training_data = [

 (array([0,0,1]), 0),

 (array([0,1,1]), 1),

 (array([1,0,1]), 1),

 (array([1,1,1]), 1),

 ]

从上训练数据能够看到布尔运算符OR的关系例如以下:

接着下来使用随机函数来生成三个0和1之间的权重值。作为初始化值:

w = random.rand(3)

 

到如今能够声明一些变量了,列表变量errors是保存着误差值,同一时候也为后面画图使用的,假设你不想画图,也没有关系。就让它这样留着。变量eta控制着学习速率,变量n是定义了迭代学习多少遍:

errors = []

eta = 0.2

n = 100

 

为了找到合适的权重值w。须要把误差值减小到0。在这个样例里,迭代100次是足够了,假设输入是一个很多噪声的数据集,须要把这个迭代数量添加到更大的值。

 

首先为了训练这个感知机。要生成随机的数据集作为输入。接着计算输入值与权重值向量之间的点积运算。从而得到能够与期望值进行比較的结果值。

假设期望值是比較大,须要把权重值添加,假设期望值是比較小,须要把权重值减小。

此校正因子计算在最后一行,当中的误差乘以学习速率(eta)和输入向量(x),再把这些权重值的误差值加到权重值向量里,这样就能够为了下一次的计算输出值向更接最近望值的方向进行调整。

for i in xrange(n):

x, expected = choice(training_data)

result = dot(w, x)

error = expected - unit_step(result)

errors.append(error)

 w += eta * error * x

所有基础的代码都编写好了。接着下来就是训练这个感知机,让它来学习或操作:

for x, _ in training_data:

result = dot(x, w)

print("{}: {} -> {}".format(x[:2], result, unit_step(result)))

 

[0 0]: -0.0714566687173 -> 0

[0 1]: 0.829739696273 -> 1

[1 0]: 0.345454042997 -> 1

[1 1]: 1.24665040799 -> 1

假设对误差值也感兴趣。能够採用可视化的库来显示出来:

from pylab import plot, ylim

ylim([-1,1])

plot(errors)

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2FpbW91c2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

能够从上图看到,从第60次迭代就没有误差值了。假设你感觉这个误差值。还不行,再计算小一些。能够把训练的次数改动为500次,或者很多其它的次数:

另外,你也能够动手把训练数据改为学习布尔运算AND,NOR或NOT,只是。你要注意的一点。它不能模拟XOR运算。由于XOR运算不是线性可划分的。假设你想模拟XOR运算必须使用多层的神经元感知机(基本上就是一个小型的神经网络了)。

 

总结

所有代码例如以下:

from random import choice 
from numpy import array, dot, random  unit_step = lambda x: 0 if x < 0 else 1  training_data = [ 
(array([0,0,1]), 0), 
(array([0,1,1]), 1), 
(array([1,0,1]), 1), 
(array([1,1,1]), 1), 
]  w = random.rand(3) 
errors = [] 
eta = 0.2 
n = 100 for i in range(n): 
    x, expected = choice(training_data) 
    result = dot(w, x) 
    error = expected - unit_step(result) 
    errors.append(error) 
    w += eta * error * x 
    
for x, _ in training_data: 
    result = dot(x, w) 
    print("{}: {} -> {}".format(x[:2], result, unit_step(result)))

1. TensorFlow API攻略

2. TensorFlow入门基本教程

3. C++标准模板库从入门到精通 

4.跟老菜鸟学C++

5. 跟老菜鸟学python

6. 在VC2015里学会使用tinyxml库

7. 在Windows下SVN的版本号管理与实战 

 http://edu.csdn.net/course/detail/2579

8.Visual Studio 2015开发C++程序的基本使用 

http://edu.csdn.net/course/detail/2570

9.在VC2015里使用protobuf协议

10.在VC2015里学会使用MySQL数据库

使用Python来编写一个简单的感知机的更多相关文章

  1. Python学习 - 编写一个简单的web框架(二)

    在上一篇日志中已经讨论和实现了根据url执行相应应用,在我阅读了bottle.py官方文档后,按照bottle的设计重写一遍,主要借鉴大牛们的设计思想. 一个bottle.py的简单实例 来看看bot ...

  2. Python学习 - 编写一个简单的web框架(一)

    自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...

  3. 用Python编写一个简单的Http Server

    用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...

  4. 编写一个简单的C++程序

    编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...

  5. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  6. 编写一个简单的Web Server

    编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...

  7. javascript编写一个简单的编译器(理解抽象语法树AST)

    javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...

  8. Java入门篇(一)——如何编写一个简单的Java程序

    最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...

  9. 用 Go 编写一个简单的 WebSocket 推送服务

    用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...

随机推荐

  1. 所有 Python 程序员必须要学会的「日志」记录。

    本文字数:3840 字 阅读本文大概需要:10 分钟 写在之前 在我们的现实生活中,「日志记录」其实是一件非常重要的事情,比如银行的转账记录,汽车的行车记录仪记录行驶过程中的一切,如果出现了什么问题, ...

  2. quagga源码学习--BGP协议创建对等体

    现有的路由协议都是通过分布式协议逐个配置协商运行的,协议协议,一个就不需要协议咯,至少2个才能够协议着做事情嘛,不过呢,这样就出现网元过多配置困难的问题,对网管软件要求也越来越高, SDN或许可能改变 ...

  3. php+mysqli预处理技术实现添加、修改及删除多条数据的方法

    本文实例讲述了php+mysqli预处理技术实现添加.修改及删除多条数据的方法.分享给大家供大家参考.具体分析如下: 首先来说说为什么要有预处理(预编译)技术?举个例子:假设要向数据库添加100个用户 ...

  4. callee返回正被执行的Function对象

    arguments.length是实参长度, arguments.callee.length是形参长度. function fn(a, b, c, d) { console.log(arguments ...

  5. 【转】Nodejs学习笔记(一)--- 简介及安装Node.js开发环境

    目录 学习资料 简介 安装Node.js npm简介 开发工具 Sublime Node.js开发环境配置 扩展:安装多版本管理器 学习资料 1.深入浅出Node.js http://www.info ...

  6. Tortoise SVN 提示 clean up 然而 clean up 没卵用的解决方法

    当 svn 提示clean up时,而clean up 仍然没用的情况下 先下载 sqlite3.exe 然后 在svn目录下,.svn 隐藏文件夹中 有个 wc.db 的文件, 执行下面命令行  s ...

  7. Jib构建你的第一个java镜像

    jib Official:GoogleContainerTools/jib 本文示例完整demo github地址 github.com/moxingwang/- 想要了解并且使用jib,首先你得知道 ...

  8. 博客移至CSDN

    CSDN博客地址:http://blog.csdn.net/pilihaotian 博客园看心情更新.

  9. 【全局变量】mysql查看全局变量以及设置全局变量的值

    1.查看mysql的所有全局变量的值 SHOW GLOBAL VARIABLES 或者 SHOW VARIABLES mysql有很多全局变量,包括系统的一些基本信息,以及mysql的一些基本配置都可 ...

  10. 使用CXF框架,发布webservice服务,并使用客户端远程访问webservice

    使用CXF框架,发布webservice服务,并使用客户端远程访问webservice  1. CXF介绍 :soa的框架    * cxf 是 Celtrix (ESB框架)和 XFire(webs ...