首页 > 编程 > Python > 正文

BP神经网络原理及Python实现代码

2020-02-16 00:11:12
字体:
来源:转载
供稿:网友

本文主要讲如何不依赖TenserFlow等高级API实现一个简单的神经网络来做分类,所有的代码都在下面;在构造的数据(通过程序构造)上做了验证,经过1个小时的训练分类的准确率可以达到97%。

完整的结构化代码见于:链接地址

先来说说原理

网络构造

上面是一个简单的三层网络;输入层包含节点X1 , X2;隐层包含H1,H2;输出层包含O1。
输入节点的数量要等于输入数据的变量数目。
隐层节点的数量通过经验来确定。
如果只是做分类,输出层一般一个节点就够了。

从输入到输出的过程

1.输入节点的输出等于输入,X1节点输入x1时,输出还是x1.
2. 隐层和输出层的输入I为上层输出的加权求和再加偏置,输出为f(I) , f为激活函数,可以取sigmoid。H1的输出为 sigmoid(w1x1 + w2x2 + b)

误差反向传播的过程

Python实现

构造测试数据

# -*- coding: utf-8 -*-import numpy as npfrom random import random as rdn'''说明:我们构造1000条数据,每条数据有三个属性(用a1 , a2 , a3表示)a1 离散型 取值 1 到 10 , 均匀分布a2 离散型 取值 1 到 10 , 均匀分布a3 连续型 取值 1 到 100 , 且符合正态分布 各属性之间独立。共2个分类(0 , 1),属性值与类别之间的关系如下,0 : a1 in [1 , 3] and a2 in [4 , 10] and a3 <= 501 : a1 in [1 , 3] and a2 in [4 , 10] and a3 > 500 : a1 in [1 , 3] and a2 in [1 , 3] and a3 > 301 : a1 in [1 , 3] and a2 in [1 , 3] and a3 <= 300 : a1 in [4 , 10] and a2 in [4 , 10] and a3 <= 501 : a1 in [4 , 10] and a2 in [4 , 10] and a3 > 500 : a1 in [4 , 10] and a2 in [1 , 3] and a3 > 301 : a1 in [4 , 10] and a2 in [1 , 3] and a3 <= 30'''def genData() : #为a3生成符合正态分布的数据 a3_data = np.random.randn(1000) * 30 + 50 data = [] for i in range(1000) : #生成a1 a1 = int(rdn()*10) + 1 if a1 > 10 :  a1 = 10 #生成a2 a2 = int(rdn()*10) + 1 if a2 > 10 :  a2 = 10 #取a3 a3 = a3_data[i]  #计算这条数据对应的类别 c_id = 0 if a1 <= 3 and a2 >= 4 and a3 <= 50 :  c_id = 0  elif a1 <= 3 and a2 >= 4 and a3 > 50 :  c_id = 1  elif a1 <= 3 and a2 < 4 and a3 > 30 :  c_id = 0 elif a1 <= 3 and a2 < 4 and a3 <= 30 :  c_id = 1 elif a1 > 3 and a2 >= 4 and a3 <= 50 :  c_id = 0  elif a1 > 3 and a2 >= 4 and a3 > 50 :  c_id = 1  elif a1 > 3 and a2 < 4 and a3 > 30 :  c_id = 0 elif a1 > 3 and a2 < 4 and a3 <= 30 :  c_id = 1 else :  print('error') #拼合成字串 str_line = str(i) + ',' + str(a1) + ',' + str(a2) + ',' + str(a3) + ',' + str(c_id) data.append(str_line) return '/n'.join(data)

激活函数

# -*- coding: utf-8 -*-"""Created on Sun Dec 2 14:49:31 2018@author: congpeiqing"""import numpy as np#sigmoid函数的导数为 f(x)*(1-f(x))def sigmoid(x) : return 1/(1 + np.exp(-x))            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表