zoukankan      html  css  js  c++  java
  • 机器学习之感知器算法原理和Python实现

    (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
  • 相关阅读:
    Django-model基础
    web框架
    django-MTV
    我与前端之间不得不说的三天两夜之jQuery
    vertical-align和line-height的深入应用
    我与前端之间不得说的三天两夜之css基础
    mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数
    我与前端之间不得不说的三天两夜之html基础
    hdu2206 IP地址的计算
    get方式中文乱码解决方法
  • 原文地址:https://www.cnblogs.com/reaptomorrow-flydream/p/9096971.html
Copyright © 2011-2022 走看看