利用BP神經網路逼近函式 Python實現

2021-08-23 14:35:23 字數 4454 閱讀 5128

文章主要參考原文是matlab版本的實現。在此基礎上,利用python實現bp網路對函式

**如下:相應部分都有注釋

###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/(1+math.exp(-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):

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*threshold*np.transpose(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)

上面是實現對正弦函式逼近的**,具體畫圖部分沒有貼。迭代500的效果如下:

可以看到效果不是很好,主要有以下原因:第一是在函式上取得點過少(上面**中取了100個點);第二就是迭代次數還達不到。大家都知道神經網路,需要大量資料以及高額的計算代價。改變引數,選取600個點以及迭代700次,效果如下:

可以發現效果比剛才已經好了很多。繼續增加迭代次數,可以得到更好的擬合效果,另外誤差的效果圖這裡就不再展示了,感興趣的可以自己用**實現。

###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/(1+math.exp(-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):

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*threshold*np.transpose(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相減即可。

BP神經網路的函式逼近

給出乙個非線性的函式,建立bp神經網路進行擬合影象,其中隱藏神經元的數目為,可以設定。bp神經網路的函式逼近k 2 x 1 05 8 f 1 sin k pi 2 x 建立bp神經網路結構 隱藏層為5 未訓練引數 n 10 net newff minmax x n,1 trainlm y1 sim ...

用BP神經網路逼近正弦函式

網路中設定輸入層與輸出層均為乙個神經元,並且考慮到正弦函式的值域分布情況,我這一次在輸出層中的啟用函式並沒有使用以前常用的sigmod函式,而是採用了線性函式y x 具體實現 如下所示 clc,clear data 3 0.01 3 xsize size data datasize xsize 2 ...

BP神經網路

基本bp神經網路演算法包括 訊號的前向傳播 誤差的反向傳播 也即計算實際輸出時按照輸入到輸出的方向進行,權值閾值調整則相反。bp是一種多層前饋神經網路,由輸入層 隱含層和輸出層組成。層與層之間有兩種訊號在流動 一種是從輸入流向輸出的工作訊號,是輸入和權值的函式 另一種是輸入流向輸出的訊號,即誤差。隱...