1. 感知机模型

  感知机Perception是一个线性的分类器,其只适用于线性可分的数据
          f(x) = sign(w.x + b)

其试图在所有线性可分超平面构成的假设空间中找到一个能使训练集中的数据可分的超平面。
因此,它找到的并不一定是最优的,即只是恰好拟合了训练数据的超平面。

2. 学习

感知机的学习策略为:最小化误分类点到超平面的距离。

3. 基于numpy的感知机实现

 1 # coding: utf-8
2 import numpy as np
3
4
5 def prepare_data(n=100):
6 # Fitting OR gate
7 def OR(x):
8 w = np.array([0.5, 0.5])
9 b = -0.2
10 tmp = np.sum(w*x) + b
11 if tmp <= 0:
12 return 0
13 else:
14 return 1
15
16 inputs = np.random.randn(n, input_size)
17 labels = np.array([OR(inputs[i]) for i in range(n)])
18 return inputs, labels
19
20
21 class Perception:
22 def __init__(self, input_size, lr=0.001):
23 # 初始化权重和偏置
24 self.w = np.random.randn(input_size)
25 self.b = np.random.randn(1)
26 self.lr = np.array(lr)
27
28 def predict(self, x):
29 tmp = np.sum(self.w*x) + self.b
30 if tmp <= 0:
31 return -1
32 else:
33 return 1
34
35 def update(self, x, y):
36 # 基于SGD的参数更新(由最小化误分类点到超平面的距离求导可得)
37 self.w = self.w + self.lr*y*x
38 self.b = self.b + self.lr*y
39
40
41 n = 1000 # 训练样本数
42 ratio = 0.8 # 训练测试比
43 input_size = 2
44
45 print("Preparing Data {}".format(n))
46 X, Y = prepare_data(n)
47 clip_num = int(n * ratio)
48 train_X, train_Y = X[:clip_num], Y[:clip_num]
49 test_X, test_Y = X[clip_num:], Y[clip_num:]
50
51 # Init model
52 lr = 0.005
53 model = Perception(input_size, lr)
54 s = model.predict(X[0])
55 print("Input: ({}, {}), Output: {}".format(X[0][0], X[0][1], s))
56
57 # Training
58 epoches = 100
59 for i in range(epoches):
60 loss = 0
61 wrong_index = []
62 print("\nEpoch {}".format(i+1))
63 print("Forward Computing")
64 for idx in range(clip_num):
65 pred_y = model.predict(train_X[idx])
66 if pred_y != train_Y[idx]:
67 wrong_index.append(idx)
68 tmp_loss = abs(float(np.sum(model.w*train_X[idx]) + model.b))
69 loss += tmp_loss
70
71 print("Wrong predict samples: {}, Loss: {}".format(len(wrong_index), loss))
72 print("Learning")
73 for j in wrong_index:
74 model.update(train_X[j], train_Y[j])
75
76
77 # Testing
78 wrong_num = 0
79 test_loss = 0
80 for j in range(test_X.shape[0]):
81 pred_y = model.predict(test_X[j])
82 if pred_y != test_Y[j]:
83 tmp_loss = abs(float(np.sum(model.w*test_X[j]) + model.b))
84 test_loss += tmp_loss
85 wrong_num += 1
86 print("\nTest wrong predict samples: {}, Loss: {}".format(wrong_num , test_loss))

4. 感知机的延伸

感知机Perception是线性模型,它不能学习非线性函数,因而它对线性不可分的数据束手无力。

例如,感知机可以拟合与门(AND)或门(OR)非门(NOT)产生的数据,但是不能处理好异或门(XOR)产生的数据。

基于感知机,可以延伸出LRSVM。此外,值得注意的是,虽然单个感知机的表达能力有限,但是如果将多个感知机叠加起来,则可以具备足够

强的表达能力,即 Multi-layer Perception(MLP)的通用近似定理(给定足够多的数据和足够宽的两层MLP,可以近似任意连续函数)。

《深度学习入门:基于Python的理论与实现》书中有一个直观的例子。假设用三个Perception分别拟合与门、非门和或门,再基于数字电路的知识将这三个门组合起来,即可以构成异或门。

深度学习基础-基于Numpy的感知机Perception构建和训练的更多相关文章

  1. 深度学习基础-基于Numpy的多层前馈神经网络(FFN)的构建和反向传播训练

    本文是深度学习入门: 基于Python的实现.神经网络与深度学习(NNDL)以及花书的读书笔记.本文将以多分类任务为例,介绍多层的前馈神经网络(Feed Forward Networks,FFN)加上 ...

  2. 深度学习基础-基于Numpy的卷积神经网络(CNN)实现

    本文是深度学习入门: 基于Python的实现.神经网络与深度学习(NNDL)以及动手学深度学习的读书笔记.本文将介绍基于Numpy的卷积神经网络(Convolutional Networks,CNN) ...

  3. [笔记] 基于nvidia/cuda的深度学习基础镜像构建流程 V0.2

    之前的[笔记] 基于nvidia/cuda的深度学习基础镜像构建流程已经Out了,以这篇为准. 基于NVidia官方的nvidia/cuda image,构建适用于Deep Learning的基础im ...

  4. 算法工程师<深度学习基础>

    <深度学习基础> 卷积神经网络,循环神经网络,LSTM与GRU,梯度消失与梯度爆炸,激活函数,防止过拟合的方法,dropout,batch normalization,各类经典的网络结构, ...

  5. AI炼丹 - 深度学习必备库 numpy

    目录 深度学习必备库 - Numpy 1. 基础数据结构ndarray数组 1.1 为什么引入ndarray数组 1.2 如何创建ndarray数组 1.3 ndarray 数组的基本运算 1.4 n ...

  6. 深度学习基础系列(九)| Dropout VS Batch Normalization? 是时候放弃Dropout了

    Dropout是过去几年非常流行的正则化技术,可有效防止过拟合的发生.但从深度学习的发展趋势看,Batch Normalizaton(简称BN)正在逐步取代Dropout技术,特别是在卷积层.本文将首 ...

  7. 深度学习基础系列(五)| 深入理解交叉熵函数及其在tensorflow和keras中的实现

    在统计学中,损失函数是一种衡量损失和错误(这种损失与“错误地”估计有关,如费用或者设备的损失)程度的函数.假设某样本的实际输出为a,而预计的输出为y,则y与a之间存在偏差,深度学习的目的即是通过不断地 ...

  8. TensorFlow深度学习基础与应用实战高清视频教程

    TensorFlow深度学习基础与应用实战高清视频教程,适合Python C++ C#视觉应用开发者,基于TensorFlow深度学习框架,讲解TensorFlow基础.图像分类.目标检测训练与测试以 ...

  9. 百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。

    百度为何开源深度机器学习平台?   有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举.   5月20日,百度在github上开源了其 ...

随机推荐

  1. 苞米面 C++ 模板库 介绍

    苞米面 C++ 模板库 简介 苞米面 C++ 模板库,无需编译,直接包含头文件就可以. 所有模板类和算法都包含在 bmm 名字空间里,例如: bmm::recent. 需要 C++ 编译器,支持 C+ ...

  2. 【审视】Scrum Master的检查清单

    一般情况下,一个Scrum Master如果更多的是做组织会议.确保时间盒以及对流程中的障碍快速响应等事项的话,可以同时引导2-3个团队.在这种情况下,团队会在降低问题发生率的基础上提高一定的绩效. ...

  3. Bugku CTF练习题---杂项---隐写3

    Bugku CTF练习题---杂项---隐写3 flag:flag{He1l0_d4_ba1} 解题步骤: 1.观察题目,下载附件 2.打开图片,发现是一张大白,仔细观察一下总感觉少了点东西,这张图好 ...

  4. [STL] vector 可变数组

    点击查看代码 #include<iostream> #include<vector> using namespace std; int main() { // 初始化 a 为 ...

  5. ucore lab1 操作系统启动过程 学习笔记

    开头赞美THU给我们提供了这么棒的资源.难是真的难,好也是真的好.这种广查资料,反复推敲,反复思考从通电后第一条代码搞起来理顺一个操作系统源码的感觉是真的爽. 1. 操作系统镜像文件ucore.img ...

  6. 【位运算】剑指offer 56. 数组中数字出现的次数

    这是一系列位运算的题目,本文将由浅入深,先从最简单的问题开始: 问题1: 一个数组中只有一个数字出现过1次,其余数字都出现过两次,请找到那个只出现1次的数字.要求时间复杂度是 \(O(n)\),空间复 ...

  7. java高级用法之:JNA中的Function

    目录 简介 function的定义 Function的实际应用 总结 简介 在JNA中,为了和native的function进行映射,我们可以有两种mapping方式,第一种是interface ma ...

  8. S2-045远程命令执行漏洞的利用

    Apache Struts2 远程命令执行 (S2-045) 漏洞介绍: 漏洞编号:S2-045CVE编号:CVE-2017-5638漏洞类型:远程代码执行漏洞级别:高危漏洞风险:黑客通过利用漏洞可以 ...

  9. css修改文子背景浮动

    伪元素选择器 """通过css操作文本内容""" 1.修改首个字体样式 p:first-letter{ color: blue; font- ...

  10. 2┃音视频直播系统之浏览器中通过 WebRTC 拍照片加滤镜并保存

    一.拍照原理 好多人小时候应该都学过,在几张空白的纸上画同一个物体,并让物体之间稍有一些变化,然后连续快速地翻动这几张纸,它就形成了一个小动画,音视频播放器就是利用这样的原理来播放音视频文件的 播放器 ...