郑捷《机器学习算法原理与编程实践》学习笔记(第六章 神经网络初步)6.5 Boltzmann机算法...
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机算法...相关推荐
- 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...
7.1.1 回归与现代预测 7.1.2 最小二乘法 7.1.3 代码实现 (1)导入数据 def loadDataSet(self,filename): #加载数据集X = [];Y = []fr = ...
- 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...
4.5.1 SVD算法回顾 A = U∑VT 其中:A是N*M的矩阵,U是M*M的方阵(里面向量正交,称为左奇异向量),∑是一个M*N的矩阵,VT是一个N*N的矩阵(里面向量正交,右奇异向量) 那么奇 ...
- 《机器学习:算法原理与编程实践》的读书笔记:SMO部分最难,大部分代码基于Scikit-Learn,决策树其实用处不大
机器学习:算法原理与编程实践 目录 [隐藏] 1 机器学习的基础 2 中文文本分类 3 决策树的发展 4 推荐系统原理 5 梯度寻优 6 神经网络初步 7 预测的技术与哲学 8 万能分类器:SVM 9 ...
- Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)
全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...
- 《区块链原理与技术》学习笔记(六) — 区块链安全
<区块链原理与技术>学习笔记 第六部分 四.区块链网络层 1. 网络层安全 1.1 分布式拒绝服务攻击(DDos) 1.2 延展性攻击 1.3 日蚀攻击 1.4 分割攻击 1.5 延迟攻击 ...
- Unix原理与应用学习笔记----第六章 文件的基本属性2
Unix原理与应用学习笔记----第六章 文件的基本属性2 改变文件权限命令:chmod 提示:文件或目录创建后,就被赋予一组默认的权限.所有的用户都有读,只有文件的所有者才有写. 相对权限设置 Ch ...
- Java编程思想学习笔记-第11章
<?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...
- Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)
全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...
- 《机器学习》 周志华学习笔记第五章 神经网络(课后习题) python实现
1.神经元模型 2.感知机与多层网络 3.误差逆传播算法 (A)BP算法:最小化训练集D上的累积误差 标准BP算法:更新规则基于单个Ek推导而得 两种策略防止过拟合:(1)早停(通过验证集来判断,训练 ...
- 传感器原理与检测技术复习笔记第六章-压电式传感器
第六章 压电式传感器 文章目录 第六章 压电式传感器 工作原理 压电效应 正压电效应 逆压电效应 压电材料 石英晶体(单晶体) 压电陶瓷(多晶体) 压电式传感器等效电路 压电式传感器的测量电路 压电元 ...
最新文章
- linux 下解压缩rar文件
- JAVA怎么创建对象组_java – 如何根据特定字段创建一组有序的对象?
- 【转】反病毒攻防研究第002篇:利用缝隙实现代码的植入
- tinyxml在linux和windows下的编译及使用详解
- div跳转html页面底部,即使没有内容,如何强制DIV块扩展到页面底部?
- Android 第二章 本地文件的读写
- 计算机科学创新大赛,计信学院举办第六届科技创新小发明大赛
- 影院平台搭建 - (7)读多写少数据的缓存
- C++编程语言类对象的赋值与复制介绍(二)
- 计算机实验报告protel,Protel99se实验报告.doc
- 嵌入式相关开源项目、库、资料
- 【IAR】 This device has been locked for debugging
- JavaSE进阶582-589 IO流(二)File类/目录拷贝
- ImageUndistorted_Disparity
- 杨辉三角形实现过程详解-C语言基础
- 能否通过手机号查询他人位置及技术实现(省流:不能)
- ASP.NET入门篇【项目实战】打造一个自己的相册(二)登录模块
- KT6368A蓝牙芯片开发注意事项以及问题集锦--长期更新
- 麒麟操作系统+龙心 编译qt-arm
- OpenDDS开发人员指南中文版3.23(1)简介
热门文章
- xftp7要继续使用此程序,您必须应用最新的更新,100%已解决.
- MATLAB/Simulink仿真 并网型风光混储直流微电网 实现:功率分配、削峰填谷、平抑功率波
- win10开启移动热点,手机无法获取ip地址
- 使用docker搭建个人博客
- 煤矸石无线测温系统项目背景
- [Microsoft Lync] Find a previous conversation - Chat History
- 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集...
- Axure-产品交互设计师的利器
- 距离多普勒谱(RD谱)绘制方法及理解
- cryEngine5.3打包