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. Jmeter-深入理解cookie,session,token

    1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档,每次请求都是一个新的HTTP协议, 就是请求加响应,  尤其是我不用记住是谁 ...

  2. python 学习分享-实战篇简单的ftp

    import socket import os import time import pickle Basedb = os.path.dirname(os.path.dirname(os.path.a ...

  3. Redis的 SORT命令

      SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [S ...

  4. [译]为什么pandas有些命令用括号结尾,有些则没有?

    文章来源:https://nbviewer.jupyter.org/github/justmarkham/pandas-videos/blob/master/pandas.ipynb 方法:用括号调用 ...

  5. maven学习(二)——手动创建maven项目

    一.Maven的简单使用 1.Maven项目的目录约定 MavenProjectRoot(项目根目录)   |----src   |     |----main   |     |         | ...

  6. 座位安排(seat)

    座位安排(seat) 题目描述 费了一番口舌,wfj_2048终于成功地说服了n∗mn∗m个妹子来陪自己看电影. 为了这次声势浩大,wfj_2048包下了一座有n∗mn∗m个座位的电影院. (wfj_ ...

  7. codechef May Challenge 2016 CHSC: Che and ig Soccer dfs处理

    Description All submissions for this problem are available. Read problems statements in Mandarin Chi ...

  8. 【06】Vue 之 组件化开发

    组件其实就是一个拥有样式.动画.js逻辑.HTML结构的综合块.前端组件化确实让大的前端团队更高效的开发前端项目.而作为前端比较流行的框架之一,Vue的组件和也做的非常彻底,而且有自己的特色.尤其是她 ...

  9. HTML 改变文字方向

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. pat 团体天梯赛 L2-006. 树的遍历

    L2-006. 树的遍历 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历 ...