您的位置:首页 > 理论基础 > 计算机网络

机器学习与神经网络(二):感知器的介绍和Python代码实现

2017-08-22 18:49 1071 查看
前言:本篇博文主要介绍感知器的相关知识,采用理论+代码实践的方式,进行感知器的学习。本文首先介绍感知器的模型,然后介绍感知器学习规则(Perceptron学习算法),最后通过Python代码实现单层感知器,从而给读者一个更加直观的认识。

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息