经典的BP神经网络通常由三层组成: 输入层, 隐含层与输出层.通常输入层神经元的个数与特征数相关,输出层的个数与类别数相同, 隐含层的层数与神经元数均可以自定义.
参考这篇文章BP神经网络:http://www.cnblogs.com/Finley/p/5946000.html
我们用一个完成训练的神经网络处理回归问题, 每个样本拥有n个输入.相应地,神经网络拥有n个输入神经元和1个输出神经元.
实际应用中我们通常在输入层额外增加一个偏置神经元, 提供一个可控的输入修正;或者为每个隐含层神经元设置一个偏置参数.我们将n个特征依次送入输入神经元, 隐含层神经元获得输入层的输出并计算自己输出值, 输出层的神经元根据隐含层输出计算出回归值.上述过程一般称为前馈(Feed-Forward)过程, 该过程中神经网络的输入输出与多维函数无异.
现在我们的问题是如何训练这个神经网络.作为监督学习算法,BP神经网络的训练过程即是根据前馈得到的预测值和参考值比较, 根据误差调整连接权重WijWij的过程.训练过程称为反向传播过程(BackPropagation), 数据流正好与前馈过程相反.
代码部分:
def test(self):
cases = [ [0, 0],
[0, 1],
[1, 0],
[1, 1], ]
labels = [[0], [1], [1], [0]] #训练数据与对应标签
self.setup(2, 5, 1)# setup(self, ni, nh, no) 输入层2 ,隐含层5 与输出层 1
self.train(cases, labels, 10000, 0.05, 0.1) # train(self, cases, labels, limit=10000, learn=0.05, correct=0.1): 训练10000次
for case in cases:# 用训练好的神经网络进行预测
print(self.predict(case)
对源代码进行修改,以适应不同的数据的训练
def test(self):#653行数据:400行作训练组,153行作测试组
dataset = np.loadtxt('cancer.csv', delimiter=",")#训练数据与对应标签
cases = dataset[:,1:10]#训练数据
labels = dataset[:,10]#与训练数据对应标签
self.setup(8, 20, 1)# 输入层8,隐含层12 与输出层 1
self.train(cases[:400], labels, 4000, 0.05, 0.1)# 训练4000次
count = [0,0]# 记录测试组,分类的正确与失败的次数
i=0
for case in cases[400:]:
if abs(self.predict(case)[0]-labels[400+i])<0.1:
count[0]=count[0]+1
else:
count[1]=count[1]+1
i=i+1
print 'result =',count
print 'error =',float(count[1])/(count[0]+count[1])# 计算错误率
cancer.csv数据表如下(部分):
患者编号 | 指标1 |