(1)感知器模型
感知器模型包含多个输入节点:X0-Xn,权重矩阵W0-Wn(其中X0和W0代表的偏置因子,一般X0=1,图中X0处应该是Xn)一个输出节点O,激活函数是sign函数。
(2)感知器学习规则
输入训练样本X和初始权重向量W,将其进行向量的点乘,然后将点乘求和的结果作用于激活函数sign(),得到预测输出O,根据预测输出值和目标值之间的差距error,来调整初始化权重向量W。如此反复,直到W调整到合适的结果为止。
(3)算法的原始形式
(4)Python代码实现
1 import numpy as np 2 3 4 class Perceptron(object): 5 6 """Perceptron classifier(感知器分类器) 7 8 Parameters(参数) 9 --------------- 10 eta:float 学习率 11 Learning rate(between 0.0 and 1.0) 12 n_iter:int 权重向量的训练次数 13 Passes over training dataset 14 15 Attributes(属性) 16 -------------- 17 w_:1d_array 一维权重向量 18 Weights after fitting 19 errors_:list 记录神经元判断错误的次数 20 Number of misclassifications in every epoch 21 """ 22 23 #初始化对象 24 def __init__(self,eta=0.01,n_iter=10): 25 self.eta=eta 26 self.n_iter=n_iter 27 28 #训练模型 29 def fit(self,X,y): 30 """ 31 fit training data.(拟合训练数据) 32 33 Parameters(参数) 34 ---------------- 35 :param x: list[np.array] 一维数组数据集 36 :param y: 被训练的数据集的实际结果 37 :return: 38 权值,初始化为一个零向量R的(m+1)次方,m代表数据集中纬度(特征)的数量 39 x.shape[1] = (100,2) 一百行2列:表示数据集中的列数即特征数 40 41 np.zeros(count) 将指定数量count初始化成元素均为0的数组 self.w_ = [ 0. 0. 0.] 42 """ 43 44 #初始化权重和错误列表 45 self.w_=np.zeros(1+X.shape[1]) 46 self.errors_=[] 47 48 for _ in range(self.n_iter): 49 errors=0 50 for xi,target in zip(X,y): 51 #计算预测与实际值之间的误差在乘以学习率 52 update=self.eta*(target-self.predict(xi)) 53 self.w_[1:]+=update*xi 54 self.w_[0]+=update*1 55 errors += int(update!=0) 56 self.errors_.append(errors) 57 return self 58 59 #定义感知器的传播过程 60 def net_input(self,X): 61 """ 62 计算净输入 63 :param x: list[np.array] 一维数组数据集 64 :return: 计算向量的点积 65 向量点积的概念: 66 {1,2,3} * {4,5,6} = 1*4+2*5+3*6 = 32 67 68 description: 69 sum(i*j for i, j in zip(x, self.w_[1:])) python计算点积 70 """ 71 print(X,end=" ") 72 print(self.w_[:],end=" ") 73 X_dot=np.dot(X,self.w_[1:])+self.w_[0] 74 print("的点积是:%d" % X_dot,end=" ") 75 return X_dot 76 77 #定义预测函数 78 def predict(self,X): 79 target_pred=np.where(self.net_input(X)>=0.0,1,-1) 80 print("预测值:%d" % target_pred,end=" ") 81 return target_pred