神经网络算法实践

2017-10-29  本文已影响0人  人机分离机
image

二、单层神经元

1. 问题描述

  1. 问题
  1. 特征1:长发(1)还是短发(0)
  2. 特征2:衣服颜色是红色(1)还是不是红色(0)
  3. 特征3:身高大于178cm(1)还是不超过178(0)
  1. 样本信息如下:
头发 衣服 身高 性别
0 0 1 0
1 1 1 1
1 0 1 1
0 1 1 0

2. 简单的单层神经网络

  1. 用X表示输入的特征向量,由于每个样本有三个特征,一共有四个样本,所以我们定义一个4X3的矩阵,每一行代表一个样本
#import numpy
import numpy as np
# input dataset
X = np.array([[0, 0, 1],
              [0, 1, 1],
              [1, 0, 1],
              [1, 1, 1]])
  1. 而四个样本对应输出(分类结果)我们用一个1X4的矩阵表示。“.T” 为转置函数,转置后变成了4X1的矩阵。
y = np.array([[0, 0, 1, 1]]).T
  1. 初始化神经网络的权重
np.random.seed(1)
syn0 = 2*np.random.random((3,1)) - 1
  1. sigmoid函数
# sigmoid function
def nonlin(x,deriv=False):
    if(deriv==True):
        return x*(1-x)
    return 1/(1+np.exp(-x))

3. 开始训练神经网络

  1. 计算输入层的加权和,即用输入矩阵L0乘以权重矩阵syn0,并通过sigmid函数进行归一化。得到输出结果l1;
  2. 计算输出结果L1与真实结果y之间的误差L1_error;
  3. 计算权重矩阵的修正L1_delta,即用误差乘以sigmoid在L处的导数;(阶梯下降法
  4. 用L1_delta更新权重矩阵syn0
for iter in range(10000):
    # forward propagation
    l0 = X
    l1 = nonlin(np.dot(l0,syn0))

    # how much did we miss?
    l1_error = y - l1

    # multiply how much we missed by the 
    # slope of the sigmoid at the values in l1
    l1_delta = l1_error * nonlin(l1,True)

    # update weights
    syn0 += np.dot(l0.T,l1_delta)

4. 一次训练过程的参数更新如下图所示:

image

5.结果

Output syn0 After Training:
[[ 9.67299303]
 [-0.2078435 ]
 [-4.62963669]]
  1. 从syn0迭代后的输出可看出
  1. 为了验证训练结果,我们加入两组新数据,(短头发,红衣服,矮个子),(长头发,不是红衣服,矮个子),并用神经网络来进行分类:
X_new = np.array([[0,1,0],
                  [1,0,0]])
y_new = np.dot(X_new,syn0)
Predicte With syn0:
[[-0.2078435 ]
 [ 9.67299303]]

github代码

三、二层神经网络

上一篇下一篇

猜你喜欢

热点阅读