使用Python来编写一个简单的感知机
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攻略
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来编写一个简单的感知机的更多相关文章
- Python学习 - 编写一个简单的web框架(二)
在上一篇日志中已经讨论和实现了根据url执行相应应用,在我阅读了bottle.py官方文档后,按照bottle的设计重写一遍,主要借鉴大牛们的设计思想. 一个bottle.py的简单实例 来看看bot ...
- Python学习 - 编写一个简单的web框架(一)
自己动手写一个web框架,因为我是菜鸟,对于python的一些内建函数不是清楚,所以在写这篇文章之前需要一些python和WSGI的预备知识,这是一系列文章.这一篇只实现了如何处理url. 参考这篇文 ...
- 用Python编写一个简单的Http Server
用Python编写一个简单的Http Server Python内置了支持HTTP协议的模块,我们可以用来开发单机版功能较少的Web服务器.Python支持该功能的实现模块是BaseFTTPServe ...
- 编写一个简单的C++程序
编写一个简单的C++程序 每个C++程序都包含一个或多个函数(function),其中一个必须命名为main.操作系统通过调用main来运行C++程序.下面是一个非常简单的main函数,它什么也不干, ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
- 编写一个简单的Web Server
编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...
- javascript编写一个简单的编译器(理解抽象语法树AST)
javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...
- Java入门篇(一)——如何编写一个简单的Java程序
最近准备花费很长一段时间写一些关于Java的从入门到进阶再到项目开发的教程,希望对初学Java的朋友们有所帮助,更快的融入Java的学习之中. 主要内容包括JavaSE.JavaEE的基础知识以及如何 ...
- 用 Go 编写一个简单的 WebSocket 推送服务
用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...
随机推荐
- Python-S9-Day114——Flask开始实战
01 今日内容概要 02 课前分享 03 内容回顾 04 路飞学城表结构(一) 05 路飞学城表结构(二) 06 路飞学城立即支付思路 07 今日作业 08 初识Flask 09 werkzug 10 ...
- idea使用maven逆向mybitis的文件
引用自 http://blog.csdn.net/for_my_life/article/details/51228098 本文介绍一下用Maven工具如何生成Mybatis的代码及映射的文件. 一. ...
- mysql的下载及配置(复制1)
---恢复内容开始--- MySQL数据库安装与配置详解 目录 一.概述 二.MySQL安装 三.安装成功验证 四.NavicatforMySQL下载及使用 一.概述 MySQL版本:5.7.17 下 ...
- 团队Alpha版本冲刺(一)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...
- SCU 4438 Censor(哈希+模拟栈)
Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text \(p\). He ...
- BZOJ4823 [Cqoi2017]老C的方块 【最小割】
题目 老C是个程序员. 作为一个懒惰的程序员,老C经常在电脑上玩方块游戏消磨时间.游戏被限定在一个由小方格排成的R行C列网格上,如果两个小方格有公共的边,就称它们是相邻的,而且有些相邻的小方格之间的公 ...
- 基于kubuntu的C/C++开发环境搭建
基于kubuntu的环境搭建 系统: kubuntu 14.04 中文输入法: SICM ibus fcitx:sougou 中文输入法的安装比较复杂,由于各种的不兼容,可能会出现各种的问题: 终端配 ...
- inline-block元素垂直对齐
多个inline-block元素使用vertical-align:middle无法对齐,必须有个height:100%的子元素才行,通常使用伪元素.另一种方法是添加line-height:normal ...
- 笔记:CS231n+assignment1(作业一)
CS231n的课后作业非常的好,这里记录一下自己对作业一些笔记. 一.第一个是KNN的代码,这里的trick是计算距离的三种方法,核心的话还是python和machine learning中非常实用的 ...
- react-router 4.0版本学习笔记
Router 所有路由组件的底层接口,一般情况都不使用,而是使用更加高级的路由. 最常用的有两种<BrowserRouter>.<HashRouter> <Browser ...