一些代码解释
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函数和它的导数