zoukankan      html  css  js  c++  java
  • 数学之路(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),但通过输入数据进入已经训练好的神经网络,仿真输出仍能达到相同的效果
  • 相关阅读:
    2.1.1 Speed Limit
    2.1.2 骑自行车的最短时间
    1.3.1提高实数精度的范例
    1.2.2一个数可以有多少种用连续素数之和表示
    求二倍关系的个数 1.2.1
    求平均值
    原生JS 购物车及购物页面的cookie使用
    基于Jquery的商城商品图片的放大镜效果(非组件)
    商城商品购买数量增减的完美JS效果
    弹性布局各种坑爹兼容
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3301801.html
Copyright © 2011-2022 走看看