BP神经网络实现分类问题(python)

一些代码解释

python版本:3.6
梯度更新

下面的代码 是对输出层和隐层的梯度计算,具体可参考周志华机器学习103页梯度更新公式

        for i in range(self.outputn):#计算输出层的梯度
            y=self.o[i]
            g[i]=y*(1-y)*(n[i]-y)
      
        for i in range(self.hiddenn):#计算隐层的梯度
            wg=0
            for j in range(self.outputn):
                wg=wg+self.ow[i][j]*g[j]
            #print(self.h[i])
            e[i]=self.h[i]*(1-self.h[i])*wg
参数更新

根据梯度更新权值和阈值

for i in range(self.hiddenn): #更新隐层到输出层的权值ow
            for j  in range(self.outputn):
                self.ow[i][j]=self.ow[i][j]+self.n*g[j]*self.h[i]
        for i in range(self.inputn):#更新输入层到隐层的权值iw
            for j in range(self.hiddenn):
                self.iw[i][j]=self.iw[i][j]+self.n*e[j]*self.i[i]

        for i in range(self.hiddenn):#更新隐层的阈值
            self.hiddencells[i]=self.hiddencells[i]-self.n*e[i]
        for i in range(self.outputn):#更新输出层阈值
            self.outputcells[i]=self.outputcells[i]-self.n*g[i]

代码

import math
import random
#-*- coding:utf-8 -*-
#random.seed(0) #使得随机值可预测

class tools(): #定义一些工具函数
    def rand(a,b):#a到b之间一个随机数
        return (b-a)*random.random()+a
    def set_m(n,m):#产生一个n*m的矩阵
        a=[]
        for i in range(n):
            a.append([0.0]*m)
        return a 
    
    def sigmoid(x):#定义sigmoid函数和它的导数
        return 1.0/(1.0+math.exp(-x))
    def sigmoid_derivate(x):
        return 
  • 9
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值