您的位置:首页 > 理论基础 > 计算机网络

数学之路(3)-机器学习(3)-机器学习算法-神经网络[14]

2013-08-28 09:50 411 查看
曲线拟合,俗称拉曲线,是一种把现有数据透过数学方法来代入一条数式的表示方式。科学和工程问题可以通过诸如采样、实验等方法获得若干离散的数据,根据这些数据,我们往往希望得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合,这过程就叫做拟合 (fitting)

多层感知器的神经网络很适合做函数拟合,我们用500个数据点来拟合,我们将前面的用python实现的多层感知器网络修改后,拟合sin函数,初始权值使用随机生成初始权值矩阵后,选择最优的生成


本博客所有内容是原创,如果转载请注明来源


http://blog.csdn.net/u010255642

部分python代码如下

def simulate(myx,sigmoid_func,delta_sigfun):
'''一个样本的仿真计算'''
print u"仿真计算中"
global ann_yi
global ann_w
global ann_wj0
global ann_y0
global hidelevel_count
global alllevel_count
global d
global mylnww

myd=d[0]

myx=np.array(myx)
n=len(myx)

#清空yi输出信号数组
hidelevel=hidelevel_count
alllevel=alllevel_count
for i in xrange(0,alllevel):
#第一维是层数,从0开始
for j in xrange(0,n):
#第二维是神经元
ann_yi[i][j]=0.0
ann_yi=np.array(ann_yi)
yi=ann_yi

#前向计算

myy=np.array([])

for nowlevel in xrange(0,alllevel):
#一层层向前计算
#计算诱导局部域
my_y=[]
myy=yi[nowlevel-1]
myw=ann_w[nowlevel-1]
if nowlevel==0:
#第一层隐藏层
my_y=myx
yi[nowlevel]=my_y
elif nowlevel==(alllevel-1):
#线性输出层
my_y=o_func(yi[nowlevel-1,:len(myd)])
yi[nowlevel,:len(myd)]=my_y
elif nowlevel==(hidelevel-1):
#最后一层隐藏输出层
for i in xrange(0,len(myd)):
temp_y=sigmoid_func(np.dot(myw[:,i],myy))
my_y.append(temp_y)

yi[nowlevel,:len(myd)]=my_y
else:
#中间隐藏层
#中间隐藏层需要加上偏置
for i in xrange(0,len(myy)):
temp_y=sigmoid_func(np.dot(myw[:,i],myy))
my_y.append(temp_y)
yi[nowlevel]=my_y
if isdebug:
print "============="
print u"***权值矩阵***"
print ann_w
print u"***输出矩阵***"
print yi
print "============="
return yi[alllevel-1,:len(myd)]

train()

delta_sigfun=ann_delta_atanh
sigmoid_func=ann_atanh

simd=[]
for xn in xrange(0,len(x)):
mytemp=simulate(x[xn],sigmoid_func,delta_sigfun)
print mytemp[0]
simd.append(mytemp[0])

temp_x=[]
temp_y=simd
temp_d=[]
i=0
for mysamp in train_x:
temp_x.append(mysamp[0])
temp_d.append(d[i][0])
i+=1

x_max=max(temp_x)
x_min=min(temp_x)
y_max=max(max(temp_y),max(d))+0.2
y_min=min(min(temp_y),min(d))-0.2

plt.subplot(211)
plt.xlabel(u"x")
plt.xlim(x_min, x_max)
plt.ylabel(u"y")
plt.ylim(y_min, y_max)
plt.title(u"http://blog.csdn.net/myhaspl" )
lp_x1 = temp_x
lp_x2 = temp_y
lp_d = temp_d
plt.plot(lp_x1, lp_x2, 'r*')
plt.plot(lp_x1,lp_d,'b*')

x_max=len(err)
x_min=1
y_max=max(err)+0.2
y_min=0.
plt.subplot(212)
plt.xlabel(u"traincount")
plt.xlim(x_min, x_max)
plt.ylabel(u"mse")
plt.ylim(y_min, y_max)

lp_x1 = xrange(1,len(err)+1)
lp_x2 = err
plt.plot(lp_x1,lp_x2,'g-')
plt.show()


通过对一些神经网络参数调整,误差率设为0.02,同时提高收敛速度,将平均训练次数控制在80以内,

>>> runfile(r'K:\book_prog\ann_mybpnhalpha.py', wdir=r'K:\book_prog')

产生权值初始矩阵 . . . . . . . . . . . . . . .

权值矩阵平均:0.002603

权值矩阵方差:0.234924

-------开始第1次训练--------- 误差为:0.595339

-------开始第2次训练--------- 误差为:0.166911

-------开始第3次训练--------- 误差为:0.076678

-------开始第4次训练--------- 误差为:0.061540

-------开始第5次训练--------- 误差为:0.047024

-------开始第6次训练--------- 误差为:0.033671

-------开始第7次训练--------- 误差为:0.029060

-------开始第8次训练--------- 误差为:0.030462

-------开始第9次训练--------- 误差为:0.024737

-------开始第10次训练--------- 误差为:0.022075

-------开始第11次训练--------- 误差为:0.021777

-------开始第12次训练--------- 误差为:0.022006

-------开始第13次训练--------- 误差为:0.019607

训练成功,正在进行检验

仿真计算中

仿真计算中

仿真计算中

..............

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: