美文网首页
1.神经网络(线性,Rosenblatt)

1.神经网络(线性,Rosenblatt)

作者: 袁一帆 | 来源:发表于2016-02-19 11:14 被阅读413次

    大纲

    1. look --- 人工神经网络的理论,计算模型

    2. write --- 少量数据栗子

    3. code --- python


    人工神经网络的理论

    历史故事(可以不看)

    1943年,美国McCulloch与Pitts从信息处理的角度,合作提出了第一个神经计算模型:二元神经元模型,简称MP模型。1949年,心理学家D.O.Hebb对大脑神经细胞、学习与条件反射作了大胆地假设,提出了著名的Hebb学习规则,即由神经元之间结合强度的改变来实现神经学习的方法。 50年代末期,Rosenblatt提出感知机(Perceptron),首先从工程角度,研究了用于信息处理的神经网络模型。

    理论(百度抄的,看了也没啥卵用)

    人工神经网络从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的连接方式组成不同的网络。在工程与学术界也常直接简称为神经网络或类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。

    模拟一个简单的线性神经网络

    没错,就是呢个大家用烂的感知学习算法:Rosenblatt
    用一个简单的二分类问题作为栗子

    基于神经元结构模型

    算法模型
    • 模型图解释:Input 输入值(x)和权值(w),权值初始化为0
    输入的数据和初始化权值.png
    • 模型图解释:Net Input Function 网络输入,是向量乘积的形式
    Net Input Function
    • 模型图解释:Activation Function 激活函数
    Activation Function
    • 模型图解释:Weight update 权值更新策略
    Weight update

    栗子出场~

    数据的模样

    X
    [ 4.8 1.4] , [ 5.1 1.6] , [ 4.6 1.4] , [ 5.3 1.5]
    [ 5.0 1.4] , [ 7.0 4.7] , [ 6.4 4.5] , [ 6.9 4.9]
    [ 5.5 4.0] , [ 6.5 4.6]
    y
    [-1 -1 -1 -1 -1 1 1 1 1 1]

    初始化权值

    w = [0,0,0]

    学习率设置为0.1

    第一次计算就遇到分类错误情况
    update = 学习率 * (真实分类 - 预测分类)
        = 0.1 * (-1 - 1)
        = -0.2

    w_new = w_old + update • X
        = [0,0,0] + -0.2 • [1 , 4.8 , 1.4]
        = [0,0,0] + [-0.2 , -0.96 , -0.28]
        = [-0.2 , -0.96 , -0.28]

    第一次循环过程

    第一轮计算过后,被错误分类的点有2个.构分类超平面的公式为


    超平面公式

    带入第一轮计算的权值得到以下超平面


    第一轮迭代得到的超平面
    10轮过后...

    权值向量w = [-0.4 -0.66 1.38]

    Paste_Image.png

    观察每次迭代以后对应的错误分类数量,发现第5次迭代以后,算法收敛


    Paste_Image.png

    Code Time

    不是手算的就不呢么寒酸只用十个数据点了~

    线性感知器社交网络

    # encoding:utf-8
    __author__ = 'Matter'
    
    import numpy as np
    class Perceptron(object):
    
        # --------  参数  --------#
        # 参数1   eta:float   学习率
        # 参数2   n_iter:int  循环次数
        # --------  属性  --------#
        # 属性1   w_:1d_array     拟合后权值
        # 属性2   errors_:list    每次迭代的错误分类
    
        # 初始化
        def __init__(self,eta=0.01,n_iter=10):
            self.eta = eta
            self.n_iter = n_iter
    
        # 训练模型
        def fit(self,X,y):
            self.w_ = np.zeros(1+X.shape[1])
            self.errors_ = []
    
            for _ in range(self.n_iter):
                errors = 0
                for xi,target in zip(X,y):
                    # 计算误差,并更新权值
                    update = self.eta * (target - self.predict(xi))
                    self.w_[1:] += update * xi
                    self.w_[0] += update
                    errors += int(update != 0.0) # 分类错误的个数
                self.errors_.append(errors) # 记录每次权值修正以后的错误分类个数
            return self
        # 输入和权值的点积,即公式的z函数,图中的net_input
        def net_input(self,X):
            return np.dot(X,self.w_[1:]) + self.w_[0]
    
        # 激活函数
        def predict(self,X):
            return np.where(self.net_input(X)>=0.0,1,-1)
    

    调用进行测试

    # encoding:utf-8
    __author__ = 'Matter'
    
    import pandas as pd
    import numpy as np
    from Perceptron import Perceptron
    
    # https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
    df = pd.read_csv("iris.data",header=None)
    
    y = df.iloc[0:100,4].values
    y = np.where(y=='Iris-setosa',-1,1)
    X= df.iloc[0:100,[0,2]].values
    
    ppn = Perceptron(eta=0.1,n_iter=10)
    ppn.fit(X,y)
    print(ppn.w_)
    # ppn.w_ : [-0.4  -0.68  1.82]
    
    

    相关文章

      网友评论

          本文标题:1.神经网络(线性,Rosenblatt)

          本文链接:https://www.haomeiwen.com/subject/efopkttx.html