python实现多层感知器


Posted in Python onJanuary 18, 2019

写了个多层感知器,用bp梯度下降更新,拟合正弦曲线,效果凑合。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
 
 
def sigmod(z):
 return 1.0 / (1.0 + np.exp(-z))
 
 
class mlp(object):
 def __init__(self, lr=0.1, lda=0.0, te=1e-5, epoch=100, size=None):
  self.learningRate = lr
  self.lambda_ = lda
  self.thresholdError = te
  self.maxEpoch = epoch
  self.size = size
  self.W = []
  self.b = []
  self.init()
 
 def init(self):
  for i in xrange(len(self.size)-1):
   self.W.append(np.mat(np.random.uniform(-0.5, 0.5, size=(self.size[i+1], self.size[i]))))
   self.b.append(np.mat(np.random.uniform(-0.5, 0.5, size=(self.size[i+1], 1))))
 
 def forwardPropagation(self, item=None):
  a = [item]
  for wIndex in xrange(len(self.W)):
   a.append(sigmod(self.W[wIndex]*a[-1]+self.b[wIndex]))
  """
  print "-----------------------------------------"
  for i in a:
   print i.shape,
  print
  for i in self.W:
   print i.shape,
  print
  for i in self.b:
   print i.shape,
  print
  print "-----------------------------------------"
  """
  return a
 
 def backPropagation(self, label=None, a=None):
  # print "backPropagation--------------------begin"
  delta = [(a[-1]-label)*a[-1]*(1.0-a[-1])]
  for i in xrange(len(self.W)-1):
   abc = np.multiply(a[-2-i], 1-a[-2-i])
   cba = np.multiply(self.W[-1-i].T*delta[-1], abc)
   delta.append(cba)
  """
  print "++++++++++++++delta++++++++++++++++++++"
  print "len(delta):", len(delta)
  for ii in delta:
   print ii.shape,
  print "\n======================================="
  """
  for j in xrange(len(delta)):
   ads = delta[j]*a[-2-j].T
   # print self.W[-1-j].shape, ads.shape, self.b[-1-j].shape, delta[j].shape
   self.W[-1-j] = self.W[-1-j]-self.learningRate*(ads+self.lambda_*self.W[-1-j])
   self.b[-1-j] = self.b[-1-j]-self.learningRate*delta[j]
   """print "=======================================1234"
   for ij in self.b:
    print ij.shape,
   print
   """
  # print "backPropagation--------------------finish"
  error = 0.5*(a[-1]-label)**2
  return error
 
 def train(self, input_=None, target=None, show=10):
  for ep in xrange(self.maxEpoch):
   error = []
   for itemIndex in xrange(input_.shape[1]):
    a = self.forwardPropagation(input_[:, itemIndex])
    e = self.backPropagation(target[:, itemIndex], a)
    error.append(e[0, 0])
   tt = sum(error)/len(error)
   if tt < self.thresholdError:
    print "Finish {0}: ".format(ep), tt
    return
   elif ep % show == 0:
    print "epoch {0}: ".format(ep), tt
 
 def sim(self, inp=None):
  return self.forwardPropagation(item=inp)[-1]
 
 
if __name__ == "__main__":
 tt = np.arange(0, 6.28, 0.01)
 labels = np.zeros_like(tt)
 print tt.shape
 """
 for po in xrange(tt.shape[0]):
  if tt[po] < 4:
   labels[po] = 0.0
  elif 8 > tt[po] >= 4:
   labels[po] = 0.25
  elif 12 > tt[po] >= 8:
   labels[po] = 0.5
  elif 16 > tt[po] >= 12:
   labels[po] = 0.75
  else:
   labels[po] = 1.0
 """
 tt = np.mat(tt)
 labels = np.sin(tt)*0.5+0.5
 labels = np.mat(labels)
 model = mlp(lr=0.2, lda=0.0, te=1e-5, epoch=500, size=[1, 6, 6, 6, 1])
 print tt.shape, labels.shape
 print len(model.W), len(model.b)
 print
 model.train(input_=tt, target=labels, show=10)
 sims = [model.sim(tt[:, idx])[0, 0] for idx in xrange(tt.shape[1])]
 
 xx = tt.tolist()[0]
 plt.figure()
 plt.plot(xx, labels.tolist()[0], xx, sims, 'r')
 plt.show()

效果图:

python实现多层感知器

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

Python 相关文章推荐
python调用fortran模块
Apr 08 Python
Python中Django发送带图片和附件的邮件
Mar 31 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
Python求平面内点到直线距离的实现
Jan 19 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
Python的历史与优缺点整理
May 26 Python
Python如何设置指定窗口为前台活动窗口
Aug 12 Python
Django rest framework分页接口实现原理解析
Aug 21 Python
python如何对链表操作
Oct 10 Python
Python txt文件如何转换成字典
Nov 03 Python
python中的时区问题
Jan 14 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 #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
You might like
PHP学习 变量使用总结
2011/03/24 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
JS求平均值的小例子
2013/11/29 Javascript
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
JavaScript图片轮播代码分享
2015/07/31 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
原生JavaScript实现AJAX、JSONP
2017/02/07 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
vue 微信授权登录解决方案
2018/04/10 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
mpvue跳转页面及注意事项
2018/08/03 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
wx-charts 微信小程序图表插件的具体使用
2019/08/18 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
Python发送以整个文件夹的内容为附件的邮件的教程
2015/05/06 Python
python线程里哪种模块比较适合
2020/08/02 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
工程测量与监理专业应届生求职信
2013/11/27 职场文书
护理实习自我鉴定
2013/12/14 职场文书
秸秆管理实施方案
2014/03/15 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
严以用权专题学习研讨会发言材料
2015/11/09 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS