python实现多层感知器MLP(基于双月数据集)


Posted in Python onJanuary 18, 2019

本文实例为大家分享了python实现多层感知器MLP的具体代码,供大家参考,具体内容如下

1、加载必要的库,生成数据集

import math
import random
import matplotlib.pyplot as plt
import numpy as np
class moon_data_class(object):
  def __init__(self,N,d,r,w):
    self.N=N
    self.w=w
   
    self.d=d
    self.r=r
  
  
  def sgn(self,x):
    if(x>0):
      return 1;
    else:
      return -1;
    
  def sig(self,x):
    return 1.0/(1+np.exp(x))
  
    
  def dbmoon(self):
    N1 = 10*self.N
    N = self.N
    r = self.r
    w2 = self.w/2
    d = self.d
    done = True
    data = np.empty(0)
    while done:
      #generate Rectangular data
      tmp_x = 2*(r+w2)*(np.random.random([N1, 1])-0.5)
      tmp_y = (r+w2)*np.random.random([N1, 1])
      tmp = np.concatenate((tmp_x, tmp_y), axis=1)
      tmp_ds = np.sqrt(tmp_x*tmp_x + tmp_y*tmp_y)
      #generate double moon data ---upper
      idx = np.logical_and(tmp_ds > (r-w2), tmp_ds < (r+w2))
      idx = (idx.nonzero())[0]
   
      if data.shape[0] == 0:
        data = tmp.take(idx, axis=0)
      else:
        data = np.concatenate((data, tmp.take(idx, axis=0)), axis=0)
      if data.shape[0] >= N:
        done = False
    #print (data)
    db_moon = data[0:N, :]
    #print (db_moon)
    #generate double moon data ----down
    data_t = np.empty([N, 2])
    data_t[:, 0] = data[0:N, 0] + r
    data_t[:, 1] = -data[0:N, 1] - d
    db_moon = np.concatenate((db_moon, data_t), axis=0)
    return db_moon

2、定义激活函数

def rand(a,b):
  return (b-a)* random.random()+a

def sigmoid(x):
  #return np.tanh(-2.0*x)
  return 1.0/(1.0+math.exp(-x))
def sigmoid_derivate(x):
  #return -2.0*(1.0-np.tanh(-2.0*x)*np.tanh(-2.0*x))
  return x*(1-x) #sigmoid函数的导数

3、定义神经网络

class BP_NET(object):
  def __init__(self):
    self.input_n = 0
    self.hidden_n = 0
    self.output_n = 0
    self.input_cells = []
    self.bias_input_n = []
    self.bias_output = []
    self.hidden_cells = []
    self.output_cells = []
    self.input_weights = []
    self.output_weights = []
    
    self.input_correction = []
    self.output_correction = []
  
  def setup(self, ni,nh,no):
    self.input_n = ni+1#输入层+偏置项
    self.hidden_n = nh
    self.output_n = no
    self.input_cells = [1.0]*self.input_n
    self.hidden_cells = [1.0]*self.hidden_n
    self.output_cells = [1.0]*self.output_n
    
    self.input_weights = make_matrix(self.input_n,self.hidden_n)
    self.output_weights = make_matrix(self.hidden_n,self.output_n)
    
    for i in range(self.input_n):
      for h in range(self.hidden_n):
        self.input_weights[i][h] = rand(-0.2,0.2)
    
    for h in range(self.hidden_n):
      for o in range(self.output_n):
        self.output_weights[h][o] = rand(-2.0,2.0)
    
    self.input_correction = make_matrix(self.input_n , self.hidden_n)
    self.output_correction = make_matrix(self.hidden_n,self.output_n)
        
  def predict(self,inputs):
    for i in range(self.input_n-1):
      self.input_cells[i] = inputs[i]
    
    for j in range(self.hidden_n):
      total = 0.0
      for i in range(self.input_n):
        total += self.input_cells[i] * self.input_weights[i][j]
      self.hidden_cells[j] = sigmoid(total)
      
    for k in range(self.output_n):
      total = 0.0
      for j in range(self.hidden_n):
        total+= self.hidden_cells[j]*self.output_weights[j][k]# + self.bias_output[k]
        
      self.output_cells[k] = sigmoid(total)
    return self.output_cells[:]
  
  def back_propagate(self, case,label,learn,correct):
    #计算得到输出output_cells
    self.predict(case)
    output_deltas = [0.0]*self.output_n
    error = 0.0
    #计算误差 = 期望输出-实际输出
    for o in range(self.output_n):
      error = label[o] - self.output_cells[o] #正确结果和预测结果的误差:0,1,-1
      output_deltas[o]= sigmoid_derivate(self.output_cells[o])*error#误差稳定在0~1内
 
    hidden_deltas = [0.0] * self.hidden_n
    for j in range(self.hidden_n):
      error = 0.0
      for k in range(self.output_n):
        error+= output_deltas[k]*self.output_weights[j][k]
      hidden_deltas[j] = sigmoid_derivate(self.hidden_cells[j])*error 

    for h in range(self.hidden_n):
      for o in range(self.output_n):
        change = output_deltas[o]*self.hidden_cells[h]
        #调整权重:上一层每个节点的权重学习*变化+矫正率
        self.output_weights[h][o] += learn*change 
    #更新输入->隐藏层的权重
    for i in range(self.input_n):
      for h in range(self.hidden_n):
        change = hidden_deltas[h]*self.input_cells[i]
        self.input_weights[i][h] += learn*change 
      
      
    error = 0
    for o in range(len(label)):
      for k in range(self.output_n):
        error+= 0.5*(label[o] - self.output_cells[k])**2
      
    return error
    
  def train(self,cases,labels, limit, learn,correct=0.1):

    for i in range(limit):        
      error = 0.0
      # learn = le.arn_speed_start /float(i+1)    
      for j in range(len(cases)):
        case = cases[j]
        label = labels[j] 
             
        error+= self.back_propagate(case, label, learn,correct)
      if((i+1)%500==0):
        print("error:",error)
        
  def test(self): #学习异或

    
    N = 200
    d = -4
    r = 10
    width = 6
    
    data_source = moon_data_class(N, d, r, width)
    data = data_source.dbmoon()
    

    
    # x0 = [1 for x in range(1,401)]
    input_cells = np.array([np.reshape(data[0:2*N, 0], len(data)), np.reshape(data[0:2*N, 1], len(data))]).transpose()
    
    labels_pre = [[1.0] for y in range(1, 201)]
    labels_pos = [[0.0] for y in range(1, 201)]
    labels=labels_pre+labels_pos
    
    self.setup(2,5,1) #初始化神经网络:输入层,隐藏层,输出层元素个数
    self.train(input_cells,labels,2000,0.05,0.1) #可以更改
    
    test_x = []
    test_y = []
    test_p = []
    
    y_p_old = 0
  
    for x in np.arange(-15.,25.,0.1):

      for y in np.arange(-10.,10.,0.1):
        y_p =self.predict(np.array([x, y]))

        if(y_p_old <0.5 and y_p[0] > 0.5):
          test_x.append(x)
          test_y.append(y)
          test_p.append([y_p_old,y_p[0]])
        y_p_old = y_p[0]
    #画决策边界
    plt.plot( test_x, test_y, 'g--')  
    plt.plot(data[0:N, 0], data[0:N, 1], 'r*', data[N:2*N, 0], data[N:2*N, 1], 'b*')
    plt.show()  
          

if __name__ == '__main__':
  nn = BP_NET()
  nn.test()

4、运行结果

python实现多层感知器MLP(基于双月数据集)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用urllib2模块获取gravatar头像实例
Dec 18 Python
python分析apache访问日志脚本分享
Feb 26 Python
从Python的源码浅要剖析Python的内存管理
Apr 16 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
Jul 28 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
python 在某.py文件中调用其他.py内的函数的方法
Jun 25 Python
详解python中__name__的意义以及作用
Aug 07 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
DRF使用simple JWT身份验证的实现
Jan 14 Python
python中altair可视化库实例用法
Jan 26 Python
基于python实现KNN分类算法
Apr 23 #Python
python实现定时发送qq消息
Jan 18 #Python
如何在Django中设置定时任务的方法示例
Jan 18 #Python
Python设计模式之工厂方法模式实例详解
Jan 18 #Python
Python设计模式之原型模式实例详解
Jan 18 #Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 #Python
Python中logging实例讲解
Jan 17 #Python
You might like
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
PHP5函数小全(分享)
2013/06/06 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
vue观察模式浅析
2018/09/25 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
vue子路由跳转实现tab选项卡
2019/07/24 Javascript
mock.js模拟数据实现前后端分离
2019/07/24 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
[01:21]2018DOTA2亚洲邀请赛4.5采访 打DOTA2也能有女朋友?
2018/04/06 DOTA
python实现对一个完整url进行分割的方法
2015/04/29 Python
剖析Python的Twisted框架的核心特性
2016/05/25 Python
python目录与文件名操作例子
2016/08/28 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
中专生求职自荐信范文
2013/12/22 职场文书
中专自我鉴定
2014/02/05 职场文书
主题党日活动总结
2014/07/08 职场文书
女性健康知识讲座主持词
2015/07/04 职场文书
100句拼搏进取的名言警句,值得一读!
2019/10/07 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
mysql的数据压缩性能对比详情
2021/11/07 MySQL