侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   233

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

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

import mathimport randomimport matplotlib.pyplot as pltimport numpy as npclass 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()+adef 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实现多层感知器
    下一条:
    基于python实现KNN分类算法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客