机器学习与神经网络(二):感知器的介绍和Python代码实现
2017-08-22 18:49
1071 查看
前言:本篇博文主要介绍感知器的相关知识,采用理论+代码实践的方式,进行感知器的学习。本文首先介绍感知器的模型,然后介绍感知器学习规则(Perceptron学习算法),最后通过Python代码实现单层感知器,从而给读者一个更加直观的认识。
根据上图,我们可以看出,神经元的输出为:
这里我们解释一下他的流程:
首先,我们输入训练样本X和初始化权重向量W,将其进行向量的点乘,然后将点乘求和的结果作用于激活函数sgn(),得到实际的输出O,现在我们根据实际输出O和期望输出d之间的差距error,来调整初始化的权重向量W。如此反复,直到W调整到合适的结果为止。
那么,我们接着来看一下,我们怎么根据实际输出和期望输出之间的差异进行权重向量W的调整呢?这就是所谓的Perceptron学习规则:
这里还是补充一点:公式中2.19a中的eta代表学习率,他表示每次调整的幅度,这是人为设置的一个参数,一般根据经验值或者通过实验得出。
1.单层感知器模型
单层感知器是一种具有单层计算单元的神经网络,他的结构和功能都非常的简单,以至于现在在实际问题中很少被采用,但是感知器(Perceptron)首次提出了自组织、自学习的思想,所以他在神经网络的学习中起着基础性的作用。1.1感知器模型
下图是一个单层感知器的模型图,他包含多个输入节点X0-Xn,权值向量W0-Wn(注意,这里X0和W0代表的是偏置因子,一般X0=1,图中X0处应该是Xn),一个输出节点o,激活函数是sgn函数。(ps图片均来自网络)根据上图,我们可以看出,神经元的输出为:
2.感知器的学习规则:
前面说过,感知器具有自学习,自适应的能力,那么他是怎么学习的呢,我们看下图这里我们解释一下他的流程:
首先,我们输入训练样本X和初始化权重向量W,将其进行向量的点乘,然后将点乘求和的结果作用于激活函数sgn(),得到实际的输出O,现在我们根据实际输出O和期望输出d之间的差距error,来调整初始化的权重向量W。如此反复,直到W调整到合适的结果为止。
那么,我们接着来看一下,我们怎么根据实际输出和期望输出之间的差异进行权重向量W的调整呢?这就是所谓的Perceptron学习规则:
这里还是补充一点:公式中2.19a中的eta代表学习率,他表示每次调整的幅度,这是人为设置的一个参数,一般根据经验值或者通过实验得出。
3.感知器的Python代码实现
好了,我们已经知道了感知器的模型以及相关的学习规则,那么,我们就可以利用Python来实现他(代码基于Python2.7,Anaconda实现)#! /usr/bin/env python #coding=utf-8 import numpy as np #感知器分类的学习 class Perceptron: ''' eta:学习率 n_iter:权重向量的训练次数 w_:权重向量 errors_:记录神经元判断出错的次数 ''' def __init__(self,eta=0.01,n_iter=10): self.eta=eta self.n_iter=n_iter def fit(self,X,y): ''' 输入训练数据X,训练神经元,X输入样本,y为样本分类 x=[[1,2],[4,5]] y=[-1,1] ''' #初始化权重向量,加1是因为W0 self.w_=np.zeros(1+X.shape[1]) #print(self.w_)#w_=[0,0,0] self.errors_=[] for i in range(self.n_iter): errors=0 ''' zip(X,y)=[[1,2,-1],[4,5,1]] ''' for xi,target in zip(X,y):#每次迭代使用一个样本去更新W #相当于update=$*(y-y'),这里使用预测的结果进行误差判断 update=self.eta*(target-self.predict(xi)) ''' xi是一个向量[1,2] update是一个数字 update*xi等价于 w1'=x1*update;w2'=x2*update ''' self.w_[1:]+=update*xi self.w_[0]+=update*1 #打印更新的W_ #print self.w_ #统计 判断的正确与否次数 errors+=int(update!=0) self.errors_.append(errors) def net_input(self,X): ''' z=w0*1+w1*x1+w2x2+...+wm*xm 其中x0=1(一般w0=0,x0=1) ''' return np.dot(X,self.w_[1:])+self.w_[0]*1 def predict(self,X):#相当于sign()函数 ''' y>=0--->1 y<0---->-1 ''' return np.where(self.net_input(X)>=0.0,1,-1)
相关文章推荐
- 机器学习与神经网络(四):BP神经网络的介绍和Python代码实现
- 机器学习与神经网络(三):自适应线性神经元的介绍和Python代码实现
- 机器学习:神经网络、正则化、多分类问题与Python代码实现
- 机器学习09--神经网络的激活函数(Activation Function)及python代码实现
- 一个 11 行 Python 代码实现的神经网络
- 机器学习之深入理解神经网络理论基础、BP算法及其Python实现
- 一篇文章教你用 11 行 Python 代码实现神经网络
- 用Python 代码实现简单的神经网络
- Python神经网络代码实现流程(三):反向传播与梯度下降
- 一个 11 行 Python 代码实现的神经网络
- Python代码实现模拟退火算法Boltzman机神经网络权重调节
- 十一行Python代码实现一个神经网络(第一部分)
- 十一行Python代码实现一个神经网络(第一部分)
- 《神经网络与深度学习》第一章 使用神经网络来识别手写数字(三)- 用Python代码实现
- 一个 11 行 Python 代码实现的神经网络
- 一个 11 行 Python 代码实现的神经网络
- 深度学习论文-神经网络的代码实现(python版本)
- Python 实现感知器模型、两层神经网络
- 十一行Python代码实现一个神经网络(第一部分)
- 神经网络之感知器算法简单介绍和MATLAB简单实现