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操作MongoDB详解及实例
May 18 Python
Python实现KNN邻近算法
Jan 28 Python
python如何去除字符串中不想要的字符
Jul 05 Python
解决Tensorflow使用pip安装后没有model目录的问题
Jun 13 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Python函数返回不定数量的值方法
Jan 22 Python
PyCharm导入python项目并配置虚拟环境的教程详解
Oct 13 Python
python数值基础知识浅析
Nov 19 Python
Python之指数与E记法的区别详解
Nov 21 Python
Python判断字符串是否为空和null方法实例
Apr 26 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
用PHP实现文件上传二法
2006/10/09 PHP
用PHP+MySql编写聊天室
2006/10/09 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
详解使用angular框架离线你的应用(pwa指南)
2019/01/31 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
python正则表达式re模块详解
2014/06/25 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
详解Python3 pickle模块用法
2019/09/16 Python
python Shapely使用指南详解
2020/02/18 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
2020/06/18 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
2021/03/03 Python
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
毕业生护理专业个人求职信范文
2014/01/04 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
天鹅湖观后感
2015/06/09 职场文书
五一晚会主持词
2015/07/01 职场文书
毕业感言怎么写
2015/07/31 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
Python爬虫之爬取二手房信息
2021/04/27 Python
Win11 Build 25179预览版发布(附更新内容+ISO官方镜像下载)
2022/08/14 数码科技