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

来源:互联网 发布:nba本赛季数据 编辑:程序博客网 时间:2024/05/16 01:55

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

阅读全文
1 0
原创粉丝点击