最近抽空学习了一下bp神经网络,并且用python实现了一下。
加入了动量项和自调节步长,都是为了拟合的更快一些(这里指定了次数)
还有就是误差稍微大了点,估计是没有标准化的缘故
python的numpy包里的矩阵乘法有些坑人,行列不分;被坑了很久,只好看了一下网上大神的博客,发现都是把矩阵拆开计算的。
from numpy import *
import math
import random as rd
#数据集的处理,filename是文件名,我这里是txt文件
def loadDataSet(filename):
num = len(open(filename).readline().split('\t')) - 1
xArr = []; yArr = []
f = open(filename)
for each in f.readlines():
link = each.strip().split('\t')
# print link[1]
current = []
current.append(1) #这里加了一项
for i in range(num):
current.append(float(link[i]))
xArr.append(current)
yArr.append(link[-1])
return xArr, yArr
#将数据集分为训练集和测试集(1份测试,9份训练)
def get_data_test(xArr, yArr, k):
xTrain = []; xTest = []
yTrain = []; yTest = []
Num = shape(xArr)[0]
for i in range(Num):
if i < 0.1*k*Num or i >= 0.1*(k+1)*Num:
xTrain.append(xArr[i])
yTrain.append(yArr[i])
else:
xTest.append(xArr[i])
yTest.append(yArr[i])
return xTrain, yTrain, xTest, yTest
#用双曲正切函数代替了S型函数
def sigmoid(x):
return math.tanh(x)
#假设函数(双曲正切)的导数
def dsigmoid(x):
return 1 - x**2
class NN:
def __init__(self, ni, nh, no):
self.ni = ni
self.nh = nh