'''
标准bp算法
每次更新都只针对单个样例,参数更新得很频繁s
dataSet 训练数据集
labels 训练数据集对应的标签
标签采用one-hot编码(一位有效编码),例如类别0对应标签为[1,0],类别1对应标签为[0,1]
alpha 学习率
num 隐层数,默认为1层
eachCount 每一层隐层的神经元数目
repeat 最大迭代次数
算法终止条件:达到最大迭代次数或者相邻一百次迭代的累计误差的差值不超过0.001
'''
def bp(dataSet, labels, alpha = 0.01, num = 1, eachCount = 10, repeat = 500):
dataSet = mat(dataSet)
m,n = shape(dataSet)
if len(labels) == 0:
print 'no train data! '
return
yCount = shape(labels[0])[1] # 输出神经元的数目
firstWMat = mat(random.sample((n + 1, eachCount))) # 输入层到第一层隐层的w值和阈值,每列第一个为阈值
hideWArr = random.sample((num - 1, eachCount + 1, eachCount)) # 隐藏间的w值和阈值,每列第一个为阈值
lastWMat = mat(random.sample((eachCount + 1, yCount))) # 最后一个隐层到输出神经元的w值和阈值,每列第一个为阈值
hideInputs = mat(zeros((num, eachCount))) # 隐层的输入
hideOutputs = mat(zeros((num, eachCount + 1))) # 隐层的输出
hideOutputs[:, 0] = -1.0 # 初始化隐层输出的每列第一个值为-1,即下一层功能神经元的阈值对应的输入恒为-1
hideEh = mat(zeros((num, eachCount))) # 隐层的梯度项
yInputs = mat(zeros((1, yCount))) # 输出层的输入
i = 0 # 迭代次数
old_ey = 0 # 前一次迭代的累积误差
sn = 0 # 相邻迭代的累计误差的差值不超过0.001的次数
while i < repeat:
for r in range(len(dataSet)):
line = dataSet[r]
# 根据输入样本计算隐层的输入和输出
xMat = mat(insert(line, 0, values=-1.0, axis=1))
hideInputs[0, :] = xMat * firstWMat
hideOutputs[0, 1:] = sigmoid(hideInputs[0, :])
for j in range(1, len(hideInputs)):
hideInputs[j, :] = hideOutputs[j -