6.5 Boltzmann机算法

6.5.1 问题的提出

6.5.2 模拟退化原理

6.5.3 Boltzmann分布与退火过程

6.5.4Boltzmann机类与退火过程

  Boltzmann网络初始时,需要根据参数设置一系列的初始值,主要参数在_init_中

  (1)构造方法如下

class BoltzmannNet(object):def __init__(self):self.dataMat   = []        #外部导入的数据集self.MAX_ITER  = 2000      #外循环迭代次数Self.T0        = 1 000     #最高温度:这个温度变化范围应位于最大迭代范围self.Lambda    = 0.97      #温度下降参数self.iteration = 0         #达到最优时的迭代次数self.dist      = []        #存储生成的距离self.pathindx  = []        #存储生成的路径索引self.bestdist  = 0         #生成的最优路径长度self.bestpath  = []        #生成的最优路径

  (2)加载数据文件类

 def loadDataSet(self,filename):     #加载数据集self.dataMat     = []self.classLabels = []fr               = open(filename)for line in fr.readlines():lineArr = line.strip().split()self.dataMat.append([float(lineArr[0]),float(lineArr[1]),1.0])self.classLabels.append(int(float(lineArr[2])))self.dataMat = mat(self.dataMat)m,n          = shape(self.dataMat)self.nSampNum = m   #样本数量self.nSampDim = n-1 #样本维度

  (3)计算矩阵各向量之间的距离--欧式距离

 def distEclud(self,vecA,vecB):#欧式距离eps = 1.0e-6return linalg.norm(vecA-vecB) + eps

  (4)玻耳兹曼函数

 def boltzmann(self,new1,old1,T):return exp(-(new1-old1)/T)

  (5)计算路径长度

 def pathLen(self,dist,path):N = len(path)plen = 0for i in xrange(0,N-1):   #长度为N的向量,包含1~N的整数plen += dist[path[i],path[i+1]]plen += dist[path[0],path[N-1]]return  plen

  (6)交换新旧路径

 def changePath(self,old_path):N = len(old_path)if random.rand() < 0.25:   #产生两个位置,并交换chpos = floor(random.rand(1,2)*N).tolist()[0]new_path = copy.deepcopy(old_path)new_path[int(chpos[0])] = old_path[int(chpos[1])]new_path[int(chpos[1])] = old_path[int(chpos[0])]else:d = ceil(random.rand(1,3)*N).tolist()[0]d.sort()  #随机路径排序a = int(d[0])b = int(d[1])c = int(d[2])if a != b and b != c:new_path = copy.deepcopy(old_path)new_path[a,c-1] = old_path[b-1:c-1]+old_path[a:b-1]else:new_path = self.changePath(old_path)return new_path

  (7)绘制路径

def drawPath(self,Seq,dataMat,color = 'b'):m,n = shape(dataMat)px  = (dataMat[Seq,0]).tolist()py  = (dataMat[Seq,1]).tolist()px.append(px[0])py.append(py[0])plt.plot(px,py,color)

  (8)绘制散点图

def drawScatter(self,plt):px = (self.dataMat[:,0]).tolist()py = (self.dataMat[:,1]).tolist()plt.scatter(px,py,c = 'green',marker = 'o',s = 60)i = 65for x,y in zip(px,py):plt.annotate(str(chr(i)),xy = (x[0]+40,y[0]),color = 'black')i += 1

  (9)绘制趋势线

  def Trendline(self,plt,color = 'b'):plt.plot(range(len(self.dist)),self.dist,color)

6.5.5 最短路径的实现

  Boltzmann网络的具体运行步骤如下

  第一步:导入数据,并根据配置参数初始化网络

  初始化网络函数如下:

  

    def initBMNet(self,m,n,distMat):self.pathindx = range(m)random.shuffle(self.pathindx)  #随机生成每个路径self.dist.append(self.pathLen(distMat,self.pathindx)) #每个路径对应的距离return self.T0,self.pathindx,m

#第一步:导入数据,并根据配置参数初始化网络def train(self):  #主函数[m,n] = shape(self.dataMat)distMat = self.distEclud(self.dataMat,self.dataMat.T) #转换为邻接矩阵(距离矩阵)# T为当前温度,curpath为当前路径索引,MAX_M为内循环最大迭代次数[T,curpath,MAX_M] = self.initBMNet(m,n,distMat)#进入主循环,计算最优路径step = 0 #初始化外循环迭代while step <= self.MAX_ITER:   #外循环m = 0                       #内循环计数器while m <= MAX_M:          #内循环curdist = self.pathLen(distMat,curpath) #计算当前路径距离newpath = self.changePath(curpath)      #交换产生新路径newdist = self.pathLen(distMat,newpath) #计算新路径距离#判断网络是否是一个局部稳态if (curdist > newdist):curpath = newpathself.pathindx.append(curpath)self.dist.append(newdist)self.iteration += 1       #增加迭代次数else:                         #如果网络处于局部稳定状态,则执行玻尔兹曼函数if random.rand()<self.boltzmann(newdist,curdist,T):curpath = newpathself.pathindx.append(curpath)self.dist.append(newdist)self.iteration += 1   #增加迭代次数m += 1step += 1T = T *self.Lambda   #降温,返回迭代,直至算法终止#第三步:提取最优路径self.bestdist = min(self.dist)indxes = argmin(self.dist)self.bestdist = self.pathindx[indxes]

6.5.6 执行算法

  

bmNet = BoltzmannNet()
bmNet.loadDataSet("dataSet25.txt")
bmNet.train()
print u"循环迭代",bmNet.bestdist
print  u"最佳路线",bmNet.bestpath
#显示优化后的城市地图、路径图
bmNet.drawScatter(plt)
plt.show()bmNet.Trendline(plt) #绘制误差算法收敛曲线
plt.show()

全部代码:

#coding:utf-8from numpy import *
import copy
import matplotlib.pyplot as pltclass BoltzmannNet(object):def __init__(self):self.dataMat   = []        #外部导入的数据集self.MAX_ITER  = 2000      #外循环迭代次数self.T0        = 1000     #最高温度:这个温度变化范围应位于最大迭代范围self.Lambda    = 0.97       #温度下降参数self.iteration = 0         #达到最优时的迭代次数self.dist      = []        #存储生成的距离self.pathindx  = []        #存储生成的路径索引self.bestdist  = 0         #生成的最优路径长度self.bestpath  = []        #生成的最优路径def loadDataSet(self,filename):     #加载数据集self.dataMat     = []self.classLabels = []fr               = open(filename)for line in fr.readlines():lineArr = line.strip().split()# self.dataMat.append([float(lineArr[0]),float(lineArr[1]),1.0])self.dataMat.append([float(lineArr[0]),float(lineArr[1])])self.classLabels.append(int(float(lineArr[2])))self.dataMat = mat(self.dataMat)m,n          = shape(self.dataMat)self.nSampNum = m   #样本数量self.nSampDim = n-1 #样本维度def distEclud(self,vecA,vecB):#欧式距离distMat = zeros((vecA.shape[0],vecA.shape[0]))for i in range(len(vecA)):for j in range(len(vecA)):distMat[i][j] = linalg.norm(vecA[i]-vecB[:,j])return  distMatdef boltzmann(self,new1,old1,T):return exp(-(new1-old1)/T)def pathLen(self,dist,path):N = len(path)plen = 0for i in xrange(0,N-1):   #长度为N的向量,包含1~N的整数plen += dist[path[i],path[i+1]]plen += dist[path[0],path[N-1]]return  plendef changePath(self,old_path):N = len(old_path)if random.rand() < 0.25:   #产生两个位置,并交换chpos = floor(random.rand(1,2)*N).tolist()[0]new_path = copy.deepcopy(old_path)new_path[int(chpos[0])] = old_path[int(chpos[1])]new_path[int(chpos[1])] = old_path[int(chpos[0])]else:d = ceil(random.rand(1,3)*N).tolist()[0]d.sort()  #随机路径排序a = int(d[0])b = int(d[1])c = int(d[2])if a != b and b != c:new_path = copy.deepcopy(old_path)new_path[a:c-1] = old_path[b-1:c-1]+old_path[a:b-1]else:new_path = self.changePath(old_path)return new_pathdef drawPath(self,Seq,dataMat,color = 'b'):m,n = shape(dataMat)px  = (dataMat[Seq,0]).tolist()py  = (dataMat[Seq,1]).tolist()px.append(px[0])py.append(py[0])plt.plot(px,py,color)def drawScatter(self,plt):px = (self.dataMat[:,0]).tolist()py = (self.dataMat[:,1]).tolist()plt.scatter(px,py,c = 'green',marker = 'o',s = 60)i = 65for x,y in zip(px,py):plt.annotate(str(chr(i)),xy = (x[0]+40,y[0]),color = 'black')i += 1def Trendline(self,plt,color = 'b'):plt.plot(range(len(self.dist)),self.dist,color)def initBMNet(self,m,n,distMat):self.pathindx = range(m)random.shuffle(self.pathindx)  #随机生成每个路径self.dist.append(self.pathLen(distMat,self.pathindx)) #每个路径对应的距离return self.T0,self.pathindx,m#第一步:导入数据,并根据配置参数初始化网络def train(self):  #主函数[m,n] = shape(self.dataMat)distMat = self.distEclud(self.dataMat,self.dataMat.T) #转换为邻接矩阵(距离矩阵)# T为当前温度,curpath为当前路径索引,MAX_M为内循环最大迭代次数[T,curpath,MAX_M] = self.initBMNet(m,n,distMat)#进入主循环,计算最优路径step = 0 #初始化外循环迭代while step <= self.MAX_ITER:   #外循环m = 0                       #内循环计数器while m <= MAX_M:          #内循环curdist = self.pathLen(distMat,curpath) #计算当前路径距离newpath = self.changePath(curpath)      #交换产生新路径newdist = self.pathLen(distMat,newpath) #计算新路径距离#判断网络是否是一个局部稳态if (curdist > newdist):curpath = newpathself.pathindx.append(curpath)self.dist.append(newdist)self.iteration += 1       #增加迭代次数else:                         #如果网络处于局部稳定状态,则执行玻尔兹曼函数if random.rand()<self.boltzmann(newdist,curdist,T):curpath = newpathself.pathindx.append(curpath)self.dist.append(newdist)self.iteration += 1   #增加迭代次数m += 1step += 1T = T *self.Lambda   #降温,返回迭代,直至算法终止#第三步:提取最优路径self.bestdist = min(self.dist)indxes = argmin(self.dist)self.bestpath = self.pathindx[indxes]bmNet = BoltzmannNet()
bmNet.loadDataSet("dataSet25.txt")
bmNet.train()
print u"循环迭代",bmNet.iteration,u"次"
print u"最优解",bmNet.bestdist
print  u"最佳路线",bmNet.bestpath
#显示优化后的城市地图、路径图
bmNet.drawScatter(plt)
plt.show()bmNet.Trendline(plt) #绘制误差算法收敛曲线
plt.show()

资料来源:郑捷《机器学习算法原理与编程实践》 仅供学习研究

转载于:https://www.cnblogs.com/wuchuanying/p/6394632.html

郑捷《机器学习算法原理与编程实践》学习笔记(第六章 神经网络初步)6.5 Boltzmann机算法...相关推荐

  1. 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...

    7.1.1 回归与现代预测 7.1.2 最小二乘法 7.1.3 代码实现 (1)导入数据 def loadDataSet(self,filename): #加载数据集X = [];Y = []fr = ...

  2. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...

    4.5.1 SVD算法回顾 A = U∑VT 其中:A是N*M的矩阵,U是M*M的方阵(里面向量正交,称为左奇异向量),∑是一个M*N的矩阵,VT是一个N*N的矩阵(里面向量正交,右奇异向量) 那么奇 ...

  3. 《机器学习:算法原理与编程实践》的读书笔记:SMO部分最难,大部分代码基于Scikit-Learn,决策树其实用处不大

    机器学习:算法原理与编程实践 目录 [隐藏] 1 机器学习的基础 2 中文文本分类 3 决策树的发展 4 推荐系统原理 5 梯度寻优 6 神经网络初步 7 预测的技术与哲学 8 万能分类器:SVM 9 ...

  4. Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)

    全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...

  5. 《区块链原理与技术》学习笔记(六) — 区块链安全

    <区块链原理与技术>学习笔记 第六部分 四.区块链网络层 1. 网络层安全 1.1 分布式拒绝服务攻击(DDos) 1.2 延展性攻击 1.3 日蚀攻击 1.4 分割攻击 1.5 延迟攻击 ...

  6. Unix原理与应用学习笔记----第六章 文件的基本属性2

    Unix原理与应用学习笔记----第六章 文件的基本属性2 改变文件权限命令:chmod 提示:文件或目录创建后,就被赋予一组默认的权限.所有的用户都有读,只有文件的所有者才有写. 相对权限设置 Ch ...

  7. Java编程思想学习笔记-第11章

    <?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...

  8. Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)

    全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...

  9. 《机器学习》 周志华学习笔记第五章 神经网络(课后习题) python实现

    1.神经元模型 2.感知机与多层网络 3.误差逆传播算法 (A)BP算法:最小化训练集D上的累积误差 标准BP算法:更新规则基于单个Ek推导而得 两种策略防止过拟合:(1)早停(通过验证集来判断,训练 ...

  10. 传感器原理与检测技术复习笔记第六章-压电式传感器

    第六章 压电式传感器 文章目录 第六章 压电式传感器 工作原理 压电效应 正压电效应 逆压电效应 压电材料 石英晶体(单晶体) 压电陶瓷(多晶体) 压电式传感器等效电路 压电式传感器的测量电路 压电元 ...

最新文章

  1. linux 下解压缩rar文件
  2. JAVA怎么创建对象组_java – 如何根据特定字段创建一组有序的对象?
  3. 【转】反病毒攻防研究第002篇:利用缝隙实现代码的植入
  4. tinyxml在linux和windows下的编译及使用详解
  5. div跳转html页面底部,即使没有内容,如何强制DIV块扩展到页面底部?
  6. Android 第二章 本地文件的读写
  7. 计算机科学创新大赛,计信学院举办第六届科技创新小发明大赛
  8. 影院平台搭建 - (7)读多写少数据的缓存
  9. C++编程语言类对象的赋值与复制介绍(二)
  10. 计算机实验报告protel,Protel99se实验报告.doc
  11. 嵌入式相关开源项目、库、资料
  12. 【IAR】 This device has been locked for debugging
  13. JavaSE进阶582-589 IO流(二)File类/目录拷贝
  14. ImageUndistorted_Disparity
  15. 杨辉三角形实现过程详解-C语言基础
  16. 能否通过手机号查询他人位置及技术实现(省流:不能)
  17. ASP.NET入门篇【项目实战】打造一个自己的相册(二)登录模块
  18. KT6368A蓝牙芯片开发注意事项以及问题集锦--长期更新
  19. 麒麟操作系统+龙心 编译qt-arm
  20. OpenDDS开发人员指南中文版3.23(1)简介

热门文章

  1. xftp7要继续使用此程序,您必须应用最新的更新,100%已解决.
  2. MATLAB/Simulink仿真 并网型风光混储直流微电网 实现:功率分配、削峰填谷、平抑功率波
  3. win10开启移动热点,手机无法获取ip地址
  4. 使用docker搭建个人博客
  5. 煤矸石无线测温系统项目背景
  6. [Microsoft Lync] Find a previous conversation - Chat History
  7. 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集...
  8. Axure-产品交互设计师的利器
  9. 距离多普勒谱(RD谱)绘制方法及理解
  10. cryEngine5.3打包