✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
❤️ 内容介绍
在工业生产中,机械设备的正常运行对于保证生产效率和质量至关重要。然而,由于长期运行和环境因素的影响,机械设备可能会出现故障,其中轴承故障是最常见的问题之一。因此,准确地检测和分类轴承故障对于预防设备损坏和提高生产效率至关重要。
近年来,深度学习技术在故障诊断和分类领域取得了显著的进展。深度置信网络(Deep Belief Network,DBN)是一种深度学习模型,具有强大的特征提取和分类能力,被广泛应用于故障诊断和分类任务中。然而,DBN模型的性能往往受到参数选择和训练算法的限制。
为了优化DBN模型的性能,本研究提出了一种基于北方苍鹰算法(Northern Goshawk Optimization,NGO)的优化方法,将其应用于DBN模型中,命名为NGO-DBN。北方苍鹰算法是一种模拟鸟类觅食行为的优化算法,具有全局搜索和局部优化的能力,能够有效地搜索最优解。
在本研究中,我们以轴承故障分类为例,使用NGO-DBN模型进行故障诊断和分类。首先,我们收集了大量的轴承振动信号数据,并对其进行预处理和特征提取。然后,我们将NGO-DBN模型应用于数据集,进行训练和测试。最后,我们评估了NGO-DBN模型在轴承故障分类任务中的性能,并与其他常用的分类算法进行了比较。
实验结果表明,NGO-DBN模型在轴承故障分类任务中表现出色。与传统的DBN模型相比,NGO-DBN模型具有更高的分类准确率和更好的泛化能力。与其他常用的分类算法相比,NGO-DBN模型在轴承故障分类任务中也取得了更好的性能。这表明北方苍鹰算法能够有效地优化DBN模型,提高其在故障诊断和分类任务中的性能。
综上所述,本研究提出的NGO-DBN模型在轴承故障分类任务中取得了良好的效果。这为深度学习在故障诊断和分类领域的应用提供了新的思路和方法。未来的研究可以进一步探索NGO-DBN模型在其他故障诊断和分类任务中的应用,并进一步优化算法和模型的性能。通过不断的研究和创新,我们有望实现更准确和高效的故障诊断和分类技术,为工业生产的可靠性和效率提供有力支持.
🔥核心代码
% This program trains Restricted Boltzmann Machine in which
% visible, binary, stochastic pixels are connected to
% hidden, binary, stochastic feature detectors using symmetrically
% weighted connections. Learning is done with 1-step Contrastive Divergence.
% The program assumes that the following variables are set externally:
% maxepoch -- maximum number of epochs
% numhid -- number of hidden units
% batchdata -- the data that is divided into batches (numcases numdims numbatches)
% restart -- set to 1 if learning starts from beginning
function [vishid,hidbiases,visbiases,batchposhidprobs]=rbm1(batchdata,restart,numhid,maxepoch,finalmomentum,initialmomentum,epsilonvb,epsilonw,weightcost,epsilonhb)
[numcases,numdims ,numbatches]=size(batchdata);
if restart ==1,
restart=0;
epoch=1;
% Initializing symmetric weights and biases.
vishid = 0.1*randn(numdims, numhid);%可视节点到隐含节点之间的权值初始化
hidbiases = zeros(1,numhid);%隐含节点的初始化为0
visbiases = zeros(1,numdims);%可视节点偏置初始化为0
poshidprobs = zeros(numcases,numhid);%初始化单个迷你块正向传播时隐含层的输出概率
neghidprobs = zeros(numcases,numhid);
posprods = zeros(numdims,numhid);
negprods = zeros(numdims,numhid);
vishidinc = zeros(numdims,numhid);
hidbiasinc = zeros(1,numhid);
visbiasinc = zeros(1,numdims);
%整个数据集正向传播时隐含层的输出概率
batchposhidprobs=zeros(numcases,numhid,numbatches);
end
for epoch = epoch:maxepoch,%所有迭代次数
%fprintf(1,'epoch %d\r',epoch);
errsum=0;
for batch = 1:numbatches, %每次迭代都遍历所有的数据块
%fprintf(1,'epoch %d batch %d\r',epoch,batch);
%%%%%%%%% 开始正向阶段的计算%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data = batchdata(:,:,batch); %每次迭代选择一个迷你块的数据,,每一行代表一个样本值
%这里的数据并非二值的,严格来说,应该将其进行二值化
poshidprobs = 1./(1 + exp(-data*vishid - repmat(hidbiases,numcases,1)));
%计算隐含层节点的输出概率,所用的是sigmoid函数
%%%计算正向阶段的参数统计量%%%%%%%%%%%%%%%%%%%%
batchposhidprobs(:,:,batch)=poshidprobs;
posprods = data' * poshidprobs;%用可视节点向量和隐含层节点向量的乘积计算正向散度统计量
poshidact = sum(poshidprobs); %针对样本值进行求和,用于计算隐含节点的偏置
posvisact = sum(data); %对数据进行求和,用于计算可视节点的偏置,当迷你块中样本的个数为1时,
% 求得的偏置向量中的又换宿相同,此时会影响预训练的结果
%%%%%%%%% 正向阶段结束 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
poshidstates = poshidprobs > rand(numcases,numhid);
%将隐含层的概率激活值poshidprobs进行0.1二值化,按照概率值大小来判定。rand(m,n)产生
%m*n大小的矩阵,将poshidprobs中的值和rand产生的比较,如果大于随机矩阵对应位置的值,则将其相应位置为1,否则为0
%%%%%%%%% 开始反向阶段的计算 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
negdata = 1./(1 + exp(-poshidstates*vishid' - repmat(visbiases,numcases,1)));
%反向阶段计算可视节点的值
neghidprobs = 1./(1 + exp(-negdata*vishid - repmat(hidbiases,numcases,1)));
%计算隐含层节点的概率值
negprods = negdata'*neghidprobs;
%计算反向散度统计量
neghidact = sum(neghidprobs);
negvisact = sum(negdata);
%%%%%%%%% 反向阶段结束 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
err= sum(sum( (data-negdata).^2 ));%计算训练集中原始数据和重构数据之间的重构误差
errsum = err + errsum;
if epoch>5,
momentum=finalmomentum; %在迭代更新参数过程中,前4次使用初始动量项,之后使用确定动量项
else
momentum=initialmomentum;
end;
%%%%%%%%%一下代码用于更新权值和偏置%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vishidinc = momentum*vishidinc + ...%权值更新时的增量
epsilonw*( (posprods-negprods)/numcases - weightcost*vishid);
visbiasinc = momentum*visbiasinc + (epsilonvb/numcases)*(posvisact-negvisact);
%可视层偏置更新时的增量
hidbiasinc = momentum*hidbiasinc + (epsilonhb/numcases)*(poshidact-neghidact);
%隐含层偏置更新时的增量
vishid = vishid + vishidinc;%更新权值
visbiases = visbiases + visbiasinc;%更新可视层偏置
hidbiases = hidbiases + hidbiasinc;%更新隐含层偏置
%%%%%%%%%%%%%%%% END OF UPDATES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
end
%fprintf(1, 'epoch %4i error %6.1f \n', epoch, errsum);
end;
%%%每次迭代结束后,显示训练集的重构误差
❤️ 运行结果
⛄ 参考文献
[1] 刘仲民,翟玉晓,张鑫,等.基于DBN-IFCM的变压器故障诊断方法[J].高电压技术, 2020, 46(12):8.DOI:10.13336/j.1003-6520.hve.20200310011.
[2] 张士强.基于深度学习的故障诊断技术研究[D].哈尔滨工业大学[2023-09-02].DOI:CNKI:CDMD:2.1018.894028.
[3] 金凌峰.变压器故障特征气体检测二氧化锡基气体传感阵列及其特性[D].重庆大学,2019.
[4] 刘文泽,张俊,邓焱.基于深度置信网络和多维信息融合的变压器故障诊断方法[J].电力工程技术, 2019, 038(006):P.16-23.DOI:CNKI:SUN:JSDJ.0.2019-06-006.