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


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

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

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

拟合的效果如下:


从效果图上可以看出,通过多层感知器建立的数据模型虽然不能直接得出输入与输出之间的确切函数y=f(x),但通过输入数据进入已经训练好的神经网络,仿真输出仍能达到相同的效果
原文地址:https://www.cnblogs.com/suncoolcat/p/3301801.html