一、全局方法:
- rand(a,b):该方法返回在区间(a,b)的任意随机数,且保证每次调用的时候返回的都是与之前不同的随机数
- generate_w(m,n):该方法返回生成的m*n的weight矩阵,且通过在该方法中调用rand(a,b)来初始化每个weight的值
- generate_b(m):该方法返回生成的m长度的bias值,且通过在该方法中调用rand(a,b)来初始化每个bias的值
- fit_function(x,deriv=False):该方法返回拟合函数,如果该方法传入的deriv是True,则返回拟合函数的导数。我试验了两种拟合函数,一种是sigmoid。另一种是tanh函数,在实验数据来看,tanh拟合效果比较好,而sigmoid由于只能输出0-1的正数,只能拟合0-π的一部分,且拟合效果不是很好。
random.seed(0)
def rand(a, b):
return (b-a) * random.random() + a
def generate_w(m, n):
w = [0.0] *m
for i in range(m):
w[i] = [0.0]*n
for j in range(n):
w[i][j] =rand(-0.69,1)#rand(-1,1) #
return w
def generate_b(m):
b = [0.0]*m
for i in range(m):
b[i] =rand(-2.409,0.02)# rand(-1,1)#
return b
def fit_function(x,deriv=False):
if deriv==True:
#return x*(1-x)
return 1-np.tanh(x) * np.tanh(x) #tanh鍑芥暟鐨勫鏁?
return np.tanh(x)
#return 1/(1+np.exp(-x))
二、 定义了BPNetwork类,其内部函数方法说明如下:
- __init__(self):定义类中所需要的数据,类中所需要维持的参数名称在此函数中事先定义。这些数据包括:
⑴ self.input_n = 0:表示输入层的神经元个数,拟合sinx需要self.input_n = 2,一个是输入的数据,另一个用来调节bias
⑵ self.input_cells = []:表示输入层的神经元输入的数据,有两个元素,一个是输入的数据;另一个用来调节bias,默认为1
⑶ self.output_n = 0:输出层的神经元个数
⑷ self.output_cells = []:输出层的神经元的输出值
⑸ self.input_w = []:输入层到第一层隐藏层的weight
⑹ self.output_w = []:最后一层隐藏层到输出层的weight
⑺ self.hidden_ns = []:隐藏层的设置,它的长度是指隐藏层个数,它的每个元素指该层隐藏层的神经元个数
⑻ self.hidden_ws = []:隐藏层的weights,其中的每个元素为上一层隐藏层到下一层隐藏层的weight,一共有n-1个weight
⑼ self.hidden_bs = []:其中的每个元素self.hidden_bs[i]都是第i层隐藏层的bias设置,其长度为隐藏层的个数
⑽ self.output_b = []:输出层的bias
⑾ self.hidden_results = []:其中的每个元素是每一层隐藏层的输出值
⑿ self.output_delt