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

前言:本篇博文主要介绍感知器的相关知识,采用理论+代码实践的方式,进行感知器的学习。本文首先介绍感知器的模型,然后介绍感知器学习规则(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)

猜你喜欢

转载自blog.csdn.net/huakai16/article/details/77483991