利⽤BP神经⽹络逼近函数——Python实现代码如下:相应部分都有注释
###function approximation f(x)=sin(x)
###2018.08.15
###激活函数⽤的是sigmoid
import numpy as np
import math
#import matplotlib.pyplot as plt
x = np.linspace(-3,3,100)
x_size = x.size
y = np.zeros((x_size,1))
# print(y.size)
for i in range(x_size):
y[i]= math.sin(x[i])
hidesize = 10
W1 = np.random.random((hidesize,1)) #输⼊层与隐层之间的权重
B1 = np.random.random((hidesize,1)) #隐含层神经元的阈值
W2 = np.random.random((1,hidesize)) #隐含层与输出层之间的权重
B2 = np.random.random((1,1)) #输出层神经元的阈值
threshold = 0.005
max_steps = 501
def sigmoid(x_):
y_ = 1/(p(-x_))
return y_
E = np.zeros((max_steps,1))#误差随迭代次数的变化
Y = np.zeros((x_size,1)) # 模型的输出结果
for k in range(max_steps):
linspace函数pythontemp = 0
for i in range(x_size):
hide_in = np.dot(x[i],W1)-B1 # 隐含层输⼊数据
#print(x[i])
hide_out = np.zeros((hidesize,1)) #隐含层的输出数据
for j in range(hidesize):
#print("第{}个的值是{}".format(j,hide_in[j]))
#print(j,sigmoid(j))
hide_out[j] = sigmoid(hide_in[j])
#print("第{}个的值是{}".format(j, hide_out[j]))
#print(hide_out[3])
y_out = np.dot(W2,hide_out) - B2 #模型输出
Y[i] = y_out
e = y_out - y[i] # 模型输出减去实际结果。得出误差
##反馈,修改参数
dB2 = -1*threshold*e
dW2 = e*anspose(hide_out)
dB1 = np.zeros((hidesize,1))
for j in range(hidesize):
dB1[j] = np.dot(np.dot(W2[0][j],sigmoid(hide_in[j])),(1-sigmoid(hide_in[j]))*(-1)*e*threshold)
dW1 = np.zeros((hidesize,1))
dW1 = np.zeros((hidesize,1))
for j in range(hidesize):
dW1[j] = np.dot(np.dot(W2[0][j],sigmoid(hide_in[j])),(1-sigmoid(hide_in[j]))*x[i]*e*threshold)
W1 = W1 - dW1
B1 = B1 - dB1
W2 = W2 - dW2
B2 = B2 - dB2
temp = temp + abs(e)
E[k] = temp
if k%100==0:
print(k)
上⾯是实现对正弦函数逼近的代码,具体画图部分没有贴。迭代500的效果如下:
可以看到效果不是很好,主要有以下原因:第⼀是在函数上取得点过少(上⾯代码中取了100个点);第⼆就是迭代次数还达不到。⼤家都知道神经⽹络,需要⼤量数据以及⾼额的计算代价。改变参数,选取600个点以及迭代700次,效果如下:
可以发现效果⽐刚才已经好了很多。继续增加迭代次数,可以得到更好的拟合效果,另外误差的效果图这⾥就不再展⽰了,感兴趣的可以⾃⼰⽤代码实现。
## 2019年11⽉25⽇更新,见到很多⼈想要画图代码,⾃⼰之前⼀直懒得重新编辑博客。但是留⾔有时候看不到,今天就全部传上来,就不⽤留⾔求代码啦。(跟前⾯的可能有点重复,只有画图部分更新了)
###function approximation f(x)=sin(x)
###2018.08.14
###激活函数⽤的是sigmoid
import numpy as np
import math
import matplotlib.pyplot as plt
x = np.linspace(-3,3,600)
# print(x)
# print(x[1])
x_size = x.size
y = np.zeros((x_size,1))
# print(y.size)
for i in range(x_size):
y[i]= math.sin(x[i])
# print(y)
hidesize = 10
W1 = np.random.random((hidesize,1)) #输⼊层与隐层之间的权重
B1 = np.random.random((hidesize,1)) #隐含层神经元的阈值
W2 = np.random.random((1,hidesize)) #隐含层与输出层之间的权重
B2 = np.random.random((1,1)) #输出层神经元的阈值
threshold = 0.005
max_steps = 1001
def sigmoid(x_):
y_ = 1/(p(-x_))
return y_
E = np.zeros((max_steps,1))#误差随迭代次数的变化
Y = np.zeros((x_size,1)) # 模型的输出结果
for k in range(max_steps):
temp = 0
for i in range(x_size):
for i in range(x_size):
hide_in = np.dot(x[i],W1)-B1 # 隐含层输⼊数据
#print(x[i])
hide_out = np.zeros((hidesize,1)) #隐含层的输出数据
for j in range(hidesize):
#print("第{}个的值是{}".format(j,hide_in[j]))
#print(j,sigmoid(j))
hide_out[j] = sigmoid(hide_in[j])
#print("第{}个的值是{}".format(j, hide_out[j]))
#print(hide_out[3])
y_out = np.dot(W2,hide_out) - B2 #模型输出
#print(y_out)
Y[i] = y_out
#print(i,Y[i])
e = y_out - y[i] # 模型输出减去实际结果。得出误差
##反馈,修改参数
dB2 = -1*threshold*e
dW2 = e*anspose(hide_out)
dB1 = np.zeros((hidesize,1))
for j in range(hidesize):
dB1[j] = np.dot(np.dot(W2[0][j],sigmoid(hide_in[j])),(1-sigmoid(hide_in[j]))*(-1)*e*threshold) dW1 = np.zeros((hidesize,1))
for j in range(hidesize):
dW1[j] = np.dot(np.dot(W2[0][j],sigmoid(hide_in[j])),(1-sigmoid(hide_in[j]))*x[i]*e*threshold)
W1 = W1 - dW1
B1 = B1 - dB1
W2 = W2 - dW2
B2 = B2 - dB2
temp = temp + abs(e)
E[k] = temp
if k%100==0:
print(k)
plt.figure()
plt.plot(x,y)
plt.plot(x,Y,color='red',linestyle='--')
plt.show()
#误差函数图直接上⾯两个函数值Y和y相减即可。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论