您的位置:首页 > 理论基础 > 计算机网络

Python代码实现模拟退火算法Boltzman机神经网络权重调节

2015-01-29 13:57 561 查看
Boltzman网络中,各神经元相互连接,相互影响; 按照异步网络更新原则(每次只更新一个神经元),对网络采用模拟退火算法更新各神经元的状态(状态值及阈值)及网络权重,可使得网络状态向能量最小化方向演化,从而,用于解决组合优化问题。

附上python代码的实现,以便学习参考:

#coding=utf-8
#在python3.4下运行
#boltzman机演示
from math import *
import random

print('=======Boltzman机工作原理演示程序======')
print('以3个神经元随机网络的相互作用为例,演示\n网络的能量状态变化')
print('=======================================')
T = 5
N = 3
W = {}
state = [0, 0, 0]
theta = [0, 0, 0]
for i in range(0, N-1):
theta[i] = random.random()
for j in range(i + 1, N):
key = '%d_%d' % (i, j)
W[key] = random.random()

print('神经元数量:', N)
print('网络初始温度:', T)
print(u"初始网络状态", state)
print('初始网络权重:', W)
print('网络初始阈值:', theta)

#计算网络能量
def getNetEnergy():
energy = 0
#设当前神经元为i
for i in range(0, N):
sm = 0
#计算其他神经元对其影响
for j in range(0, N):
if (i != j):
if i > j:
key = '%d_%d' % (j, i)
else:
key = '%d_%d' % (i, j)
sm = sm + W[key] * state[j]
sm = -0.5 * state[i] * sm + theta[i] * state[i]
energy = energy + sm
return energy

while True:
#确定激活神经元
nn = int(ceil(random.random() * N) - 1)
sm = 0
for i in range(0, N):
if (i != nn):
if (i > nn):
key = '%d_%d' % (nn, i)
else:
key = '%d_%d' % (i, nn)
sm = sm + W[key] * state[i]
sm = sm - theta[nn]
if (sm > 0):
#接受新状态改变为1
state[nn] = 1
else:
#随机为1的概率
T0 = -sm / T
pr1 = 1 / (1 + exp(T0))
r = random.random()
if (pr1 > r):
state[nn] = 1
else:
state[nn] = 0
#输出网络状态与能量
print('Energy(%d, %d, %d)=%f' % (state[0], state[1], state[2], getNetEnergy()) )
#降温处理
T = 0.95 * T
if (sum(state) == 3):
break

print('计算结果:')
print('神经元状态:', state)
print('权重:', W)
print(theta)
#输出网络能量
print('网络最终能量=%f' % (getNetEnergy()))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: