标准BP算法,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# -*- coding: utf-8 -*-
"""
Created on Tue Nov 15 20:27:27 2016

@author: hugox
"""
from numpy import *
import pandas as pd
#读取西瓜数据集3.0
df = pd.read_excel('watermelon_3.xlsx')
#获取输入属性描述个数d
n,d = shape(df)
d = d-1
#设置隐层神经元个数q
q = 8
#设置输出层神经元个数l
l = 1
#创建训练数据
dataMat = array(df[['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖率']].values[:,:])
labelMat = array(df['好瓜'].values[:]).reshape(n,1)
#定义学习率
alpha = 0.01
#随机初始化参数
v = random.random((d, q))
w = random.random((q, l))
theta = random.random((1,l))
gamma = random.random((1,q))

#设定计数器
count = 1
#sigmoid函数
def sigmoid(x):
return 1/(1+exp(-x))

#标准BP算法
while 1:
bm_o = sigmoid(dot(dataMat, v) - gamma)
ym_o = sigmoid(dot(bm_o, w) - theta)
E = labelMat - ym_o
if count % 10000 == 0: #每万次训练误差
print('count=%s error=%s' %(count, sum(E**2)/n))
if sum(E**2)/n<0.05:
break
for i in range(17): #遍历训练集
x = dataMat[i].reshape(1,d)
y = labelMat[i].reshape(1,l)
b_o = sigmoid(dot(x,v) - gamma)
y_o = sigmoid(dot(b_o,w) - theta)
g = y_o * (1 - y_o) * (y - y_o)
e_ = multiply((b_o * (1 - b_o)).T, dot(w, g.T))
w += alpha * dot(b_o.T, g)
theta -= alpha * g
v += alpha * dot(e_, x).T
gamma -= alpha * e_.T
count += 1

print('count=%s\nlabelMat.T=%s\nym_o.T=%s\n' %(count,labelMat.T,ym_o.T))

结果:

1
2
3
4
5
count=24538
labelMat.T=[[1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0]]
ym_o.T=[[ 0.90132009 0.91187822 0.90542603 0.90875066 0.89242418 0.80328137
0.78106316 0.84833066 0.01111388 0.04960994 0.00191411 0.00273196
0.06605518 0.00396744 0.82685213 0.00230384 0.05778858]]

累计误差BP算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# -*- coding: utf-8 -*-
"""
Created on Tue Nov 15 20:27:27 2016

@author: hugox
"""
import numpy as np
import pandas as pd
#读取西瓜数据集3.0
df = pd.read_excel('watermelon_3.xlsx')
#获取输入属性描述个数d
n,d = np.shape(df)
d = d-1
#设置隐层神经元个数q
q = 8
#设置输出层神经元个数l
l = 1
#创建训练数据
x = np.array(df[['色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖率']].values[:,:])
y = np.array(df['好瓜'].values[:]).reshape(n,1)
#定义学习率
alpha = 0.01
#随机初始化参数
v = np.random.random((d, q))
w = np.random.random((q, l))
theta = np.random.random((1,l))
gamma = np.random.random((1,q))
#设定计数器
count = 1
#sigmoid函数
def sigmoid(x):
return 1/(1+np.exp(-x))

while 1:
b = sigmoid(np.dot(x, v) - gamma)
yk = sigmoid(np.dot(b, w) - theta)
E = y - yk
if sum(E**2)/n < 0.05:
print('count=%s\nyk=%s' %(count, yk.T))
break
g = yk * (1 - yk) * E
e =( b * (1 - b)).T * np.dot(w, g.T)
w += alpha * np.dot(b.T, g)
theta -= alpha * sum(g)
v += alpha * np.dot(e, x).T
gamma -= alpha * sum(e.T)
count += 1

结果:

1
2
3
4
5
6
count=162031
yk=[[ 8.84357559e-01 9.06879592e-01 8.93073696e-01 9.04785665e-01
8.82341627e-01 8.41231113e-01 8.40631778e-01 8.54573262e-01
2.29866010e-03 1.57970162e-02 1.66913966e-04 6.13303109e-04
2.51333929e-02 9.59186328e-04 8.48746128e-01 4.97818568e-04
2.42992827e-02]]

西瓜数据集3.0

色泽 根蒂 敲声 纹理 脐部 触感 密度 含糖率 好瓜
1 2 1 2 3 1 1 0.697 0.46 1
2 3 1 3 3 1 1 0.774 0.376 1
3 3 1 2 3 1 1 0.634 0.264 1
4 2 1 3 3 1 1 0.608 0.318 1
5 1 1 2 3 1 1 0.556 0.215 1
6 2 2 2 3 2 2 0.403 0.237 1
7 3 2 2 2 2 2 0.481 0.149 1
8 3 2 2 3 2 1 0.437 0.211 1
9 3 2 3 2 2 1 0.666 0.091 0
10 2 3 1 3 3 2 0.243 0.267 0
11 1 3 1 1 3 1 0.245 0.057 0
12 1 1 2 1 3 2 0.343 0.099 0
13 2 2 2 2 1 1 0.639 0.161 0
14 1 2 3 2 1 1 0.657 0.198 0
15 3 2 2 3 2 2 0.36 0.37 0
16 1 1 2 1 3 1 0.593 0.042 0
17 2 1 3 2 2 1 0.719 0.103 0