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

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

2013-09-03 21:59 267 查看



我们也可以尝试用多层感知器网络对一组数据建立模型,在输入与输出数据之间建立非线性关系,用神经网络拟合输出数据,训练好后,输入其它值,能得到一个较精确的仿真输出数据
下面是钢包使用次数与容积实测数据

钢包使用次数与容积实测数据
使用次数x容积y 
2106.42 
3108.2 
4109.58 
5109.5 
7110 
8109.93 
10110.49 
11110.59 
14110.6 
15110.9 
16110.7 
18111 
19111.2 


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


http://blog.csdn.net/u010255642

我们用多层感知器对这组数据进行训练,以使用次数为输入,以容积为输出,建立它们之间的关系。
部分python代码如下:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#bp ann
import numpy as np
import matplotlib.pyplot as plt
import random
import copy

isdebug=False

#x和d样本初始化
#x和d样本初始化
train_x =[]
d=[]
f = open("cubage.csv")
try:
f_text = f.read( )
finally:
f.close( )
x_text=f_text.split('\n')
for line_i in xrange(0,len(x_text)):
line=x_text[line_i]
if line_i>1 and len(line)>0:
train_x.append([])
hdata=line.split(',')
train_x[line_i-2].append(float(hdata[0]))
d.append([float(hdata[1])])

myinput=np.array(train_x)
mytarget=np.array(d)
mymax=np.max(d)
tz=(0.1**(len(str(int(mymax)))))*5
myinput=tz*myinput
mytarget=tz*mytarget
train_x=myinput
d=mytarget
......................
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)):
mysimout=simulate(x[xn],sigmoid_func,delta_sigfun)
simd.append(mysimout[0])

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

simd=np.array(simd)
simd/=tz
temp_x=np.array(temp_x)
temp_x/=tz
temp_d=np.array(temp_d)
temp_d/=tz
temp_y=simd

x_max=max(temp_x)
x_min=min(temp_x)
y_max=max(temp_y)
y_min=min(temp_y)

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*')

errx_max=len(err)
errx_min=1
erry_max=max(err)+0.1
erry_min=0.
plt.subplot(212)
plt.xlabel(u"traincount")
plt.xlim(errx_min, errx_max)
plt.ylabel(u"mse")
plt.ylim(erry_min, erry_max)

lp_x1 = xrange(1,len(err)+1)
lp_x2 = err
plt.plot(lp_x1,lp_x2,'g-')
plt.show()
在计算误差时,我们不使用mse均方误差,数据拟合我们在这里以平均残差最小为目标,残差是指估计的数值与实际数值之差的绝对值。这里实际效果更好。

拟合的效果如下:



从效果图上可以看出,通过多层感知器建立的数据模型虽然不能直接得出输入与输出之间的确切函数y=f(x),但通过输入数据进入已经训练好的神经网络,仿真输出仍能达到相同的效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: