【机器学习笔记19】神经网络(单层感知机)

【参考资料】
【1】《人工神经网络教程》
【2】《matlab 2015b 神经网络技术》

基本概念

【机器学习笔记19】神经网络(单层感知机)_第1张图片

单层感知器可以看成一个线性累加器和一个二值化阈值元器件,通常会在累加一个偏移量。由公式表达为: o j = s g n ( ∑ i = 1 n w i j x i + b ) o_j= sgn(\sum_{i=1}^n w_{ij}x_i+b) oj=sgn(i=1nwijxi+b)
其中
o j = { 1 , s g n ( ∑ i = 1 n w i j x i + b ) ≥ 0 − 1 , s g n ( ∑ i = 1 n w i j x i + b ) < 0 o_j = \begin{cases} 1, & sgn(\sum_{i=1}^n w_{ij}x_i+b) \ge 0 \\ -1, & sgn(\sum_{i=1}^n w_{ij}x_i+b) < 0 \end{cases} oj={1,1,sgn(i=1nwijxi+b)0sgn(i=1nwijxi+b)<0

实时上对于单层感知机而言,是根据输入的x和o值,估计了参数w,而构筑了一个 ∑ i = 1 n w i j x i + b = 0 \sum_{i=1}^n w_{ij}x_i+b = 0 i=1nwijxi+b=0的超平面。
【机器学习笔记19】神经网络(单层感知机)_第2张图片

单层感知机的模型相当于是求解n元线性非齐次方程的逆过程,前者是已知阈值和输出求x,后者是已经输入x和输出y估计参数。在估计的判断机制里,神经网络是期望有更多的输入样本符合判断,而支持向量机则是让超片面与各个样本点有最远的距离。

基本学习算法

此步骤描述只考虑一个输出

第一步 初始化

对于 w 1 j w_{1j} w1j等所有权值赋予一个较小的随机数

第二步 输入训练样本

输入训练样本 ( x p , d p ) (x^p, d^p) (xp,dp),前者为输入,后者为期望输出

第三步 计算实际输出

计算实际输出 o j p = ∑ i = 1 n w i j x p + b o_j^p=\sum_{i=1}^n w_{ij}x^p+b ojp=i=1nwijxp+b

第四步 根据实际输出与期望输出的差值调整参数

调整权值参数 w 1 j t + 1 = w 1 j t + η ( o j p − d p ) x p w_{1j}^{t+1} = w_{1j}^t + \eta(o_j^p-d^p)x^p w1jt+1=w1jt+η(ojpdp)xp,这里 η \eta η又称为学习率

第四步

重复步骤2,直到所有的样本(满足要求数量)都符合期望的输出

代码实践

import numpy as np
from keras.models import Sequential
from keras.layers import Dense



def _test_signle_perceptron():

    x_train = np.array([[-1, 1, -2, 0],[-1, 0, 1.5, -0.5],[-1, -1, 1, 0.5]], dtype=float);

    y_train = np.array([[-1], [-1], [1]])

    """
    Sequential 序贯模型是多个网络层的线性堆叠
    """

    model = Sequential()

    """
    Dense 为常用的全连接层,主要参数:
        units:该层输出的维度
        input_dim:输入的维度
        activation:激活函数
        use_bias:是否有偏移量
    """

    model.add(Dense(units=1, input_dim=4, activation='linear', use_bias=False))

    #设置一个初始化的权值
    model.set_weights([np.array([[0.5], [1], [-1], [0.]], dtype = float), np.array([0.], dtype=float)])


    """
    compile 为编译整个模型
    loss 损失函数 mae 为mean_absolute_error
    optimizer 优化器 SGD 为梯度下降法
    metrics: 列表,显示训练时的一些性能指标

    """
    model.compile(loss='mae',
              optimizer='SGD',
              metrics=['accuracy'])

    """
    fit 为实际的训练模型方法
    epochs 训练的轮数
    batch_size 在做梯度下降时每次用到的样本
    """
    model.fit(x_train, y_train,
          epochs=3,
          batch_size=3)

    print(model.get_weights())


"""
说明:

单层感知器线性模型,验证《人工神经网络教程》例 3.2 

这个例子主要是梳理Keras模型的基础函数,对神经网络训练本身意义不大:)

作者:fredric

日期:2018-8-18

"""
if __name__ == "__main__":

    print("sigle perceptron test>>>>>>>>")

    _test_signle_perceptron()

你可能感兴趣的:(机器学习,机器学习笔记)