先贴出BP神经网络代码如下:
class NeuralNetwork:
def __init__(self, layers, activation='tanh'):
if activation == 'logistic':
self.activation = logistic
self.activation_deriv = logistic_derivative
elif activation == 'tanh':
self.activation = tanh
self.activation_deriv = tanh_deriv
self.weights = []
for i in range(1, len(layers) - 1):
self.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25)#i指当前层神经元
self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25)
def fit(self, X, y, learning_rate=0.2, epochs=10000):
X = np.atleast_2d(X)
temp = np.ones([X.shape[0], X.shape[1]+1])
temp[:, 0:-1] = X
X = temp
y = np.array(y)
for k in range(epochs):
i = np.random.randint(X.shape[0])
a = [X[i]]
for l in range(len(self.weights)):
a.append(self.activation(np.dot(a[l], self.weights[l])))
error = y[i] - a[-1]
deltas = [error * self.activation_deriv(a[-1])]
for l in range(len(a) - 2, 0, -1):
deltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))
deltas.reverse()
for i in range(len(self.weights)):
layer = np.atleast_2d(a[i])
delta = np.atleast_2d(deltas[i])
self.weights[i] += learning_rate * layer.T.dot(delta)
def predict(self, x):
x = np.array(x)
temp = np.ones(x.shape[0]+1)
temp[0:-1] = x
a = temp
for l in range(0, len(self.weights)):
a = self.activation(np.dot(a, self.weights[l]))
return a
接下来,我将在具体的数学模型中描述上面代码的数学模型
在此之前,先介绍几个概念:
一、背景
1.1以人脑中的神经网络为启发,历史上出现过很多不同版本
1.2最著名的算法是1980年的 backpropagation(反向传播)
二、多层向前神经网络( Multilayer Feed- Forward Neural Network)
(1) 每层由单元(units)组成
(2) 输入层(input layer)是由训练集的实例特征向量传入
(3) 经过连接结点的权重(weight)传入下一层,一层的输出是下一层的输入
(4) 隐藏层的个数是任意的,输出层和输入层只有一个
(5) 每个单元(unit)也可以被称作神经结点,根据生物学来源定义
(6) 上图称为2层的神经网络(输入层不算)
(7) 一层中加权的求和,然后根据非线性的方程转化输出
(8) 作为多层向前神经网络,理论上,如果有足够多的隐藏层(hidden layers)和足够大的训练集,可以模拟出任何方程
三、设计一个神经网络
3.1使用神经网络训练数据之前,必须确定神经网络层数,以及每层单元个数
3.2特征向量在被传入输入层时通常被先标准化(normalize)和0和1之间(为了加强学习过程)
3.3离散型变量可以被编码成每一个输入单元对应一个特征可能赋的值
比如:特征值A可能取三个值(a0,a1,a2),可以使用三个输入单元来代表A
如果A=a0,那么代表a0的单元值就取1,其他取0
如果A=a1,那么代表a1的单元值就取1,其他取0,以此类推
例如输出值为【0,9】,那么0就是0.1,1就是0.01,2就是0.001,3就是0.003.。。。。以此类推
3.4神经网络即可以用来做分类(classification)问题,也可以解决回归(regression)问题
&nbs