本博客所有内容是原创,如果转载请注明来源
http://blog.csdn.net/u010255642
我们也可以尝试用多层感知器网络对一组数据建立模型,在输入与输出数据之间建立非线性关系,用神经网络拟合输出数据,训练好后,输入其它值,能得到一个较精确的仿真输出数据
下面是钢包使用次数与容积实测数据
钢包使用次数与容积实测数据 | ||
使用次数x | 容积y | |
2 | 106.42 | |
3 | 108.2 | |
4 | 109.58 | |
5 | 109.5 | |
7 | 110 | |
8 | 109.93 | |
10 | 110.49 | |
11 | 110.59 | |
14 | 110.6 | |
15 | 110.9 | |
16 | 110.7 | |
18 | 111 | |
19 | 111.2 |
我们用多层感知器对这组数据进行训练,以使用次数为输入,以容积为输出,建立它们之间的关系。
部分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()
拟合的效果如下:
作者:u010255642 发表于2013-9-3 21:59:01 原文链接
阅读:14 评论:0 查看评论