【预测模型】基于matlab模糊小波神经网络目标威胁评估【含Matlab源码 1621期】

举报
海神之光 发表于 2022/05/29 00:11:54 2022/05/29
【摘要】 一、模糊小波神经网络简介 1 模糊小波神经网络原理 为了加强网络的自学习能力以及快速的适应战场环境变化,实现对目标威胁进行精确评估,将小波神 经网络嵌入模糊模型的后件部分形成模糊小波神经网络,网络结构如...

一、模糊小波神经网络简介

1 模糊小波神经网络原理
为了加强网络的自学习能力以及快速的适应战场环境变化,实现对目标威胁进行精确评估,将小波神
经网络嵌入模糊模型的后件部分形成模糊小波神经网络,网络结构如图 2所示:前三层已在之前提到,第四层改为小波函数层,选择 Gaussian 函数的一阶偏导数 φ(x) = x ·exp(−0.5x2) 作为母小波函数,该函数具有较好的拟合性能,根据所选母小波,经过伸缩平移变换放入第二层的神经元中作为激活函数,可以表示为
在这里插入图片描述
在这里插入图片描述
模糊小波神经网络的参数在网络训练的过程需要进行自动更新和调整,这里使用梯度下降法对网络参
数进行更新参数 c、t、d、w 的操作,为了获得良好的预测效果,最终会选择这些参数的最优值作为预测部份的参数值。

二、部分源代码

%FWNN 脚本文件,作为主程序使用
% 清理工作
close all
clear
% 关键变量
d = 5; % 用于输入的宽度
m = d; % 输入信号的个数
n = 5; % 关系函数的个数,模糊判断的个数,小波函数的个数
epoch = 2000; % 迭代次数
num_yangben = 49; % 数据个数
num_test = 12;
rate = 0.08; % 学习速率
mom = 0.5; % 冲量 

% 产生试验数据
data = indata();
%result = plant(data);
result = data(:,d+1);
% TEST
file_yangben = '测试集.dat';
fid = fopen(file_yangben);
%u = fread(fid,[size_input_x,size_input_y],'float');
u_test = dlmread(file_yangben,',');
fclose(fid);

% 随机初始化各个参数于(01)
c = rand(m, n);
q = rand(m, n); % 注意:不能为零
a = rand(n, m);
b = rand(n, m);
w = rand(1, n);

% t-1迭代的参数值
pc = c;
pq = q;
pa = a;
pb = b;
pw = w;

% t+1迭代的参数值
nc = zeros(m, n);
nq = zeros(m, n);
na = zeros(n, m);
nb = zeros(n, m);
nw = zeros(1, n);

% 用于画图的数据
tu = zeros(epoch, num_yangben);
E = zeros(epoch, num_yangben);

% 训练过程
tic % 开始计时
for loop1 = 1 : 1 : epoch
    for loop2 = 1 : 1 : num_yangben
        % 初始化中间数据
        x = zeros(1, m);
        g = zeros(m, n);
        U = zeros(1, n);
        p = zeros(1, n);
        W = zeros(1, n);
        %y = zeros(1, n);
        % 给输入节点赋值
        for i = 1 : 1 : d
            x(i) = data(loop2,i);
        end
        %for i = 1 : 1 : d
           % x(m + 1 - i) = result(loop2 - i);
        %end
        % 计算第二层节点的输出值
        for i = 1 : 1 : m
            for j = 1 : 1 : n
                g(i, j) = relation(x(i), c(i, j), q(i, j));
            end
        end
        % 计算第三层节点的输出,同时记录第三层节点的选择信息
        for i = 1 : 1 : n
            [min, which] = fuzzy(g, m, i);
            U(i) = min;
            p(i) = which;
        end
        % 计算第四层节点的输出
        for i = 1 : 1 : n
            for j = 1 : 1 : m
                W(i) = W(i) + wavelet(x(j), a(i, j), b(i, j));
            end
        end
        y = w .* W;
        % 计算最终的输出
        u = defuzz(U, y, n);
        tu(loop1, loop2) = u;
        % 计算误差
        temp1 = u - result(loop2);
        E(loop1, loop2) = temp1^2 / 2;
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
        % 下面使用梯度下降算法修正参数
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
        % 计算E对w的偏导数
        temp2 = sigamau(U, n);
        Etow = zeros(1, n);
        sima = zeros(1, n);
        for i = 1 : 1 : n
            Etow(i) = temp1 * U(i) * W(i) / temp2;
            sima(i) = temp1 * U(i) * w(i) / temp2;
        end
        % 计算几个下面会重复使用的数据
        temp3 = zeros(n, m);
        temp4 = zeros(n, m);
        for i = 1 : 1 : n
            for j = 1 : 1 : m
                temp3(i, j) = varz2(x(j), a(i, j), b(i, j)); % temp3= z^2
                temp4(i, j) = exp(-temp3(i, j)/2) / sqrt(abs(a(i, j))^3); % temp4 = ?
            end
        end
      
        % 计算E对b的偏导数
        Etob = zeros(n, m);
        for i = 1 : 1 : n
            for j = 1 : 1 : m
                temp5 = temp3(i, j); % temp5 = z^2
                Etob(i, j) = sima(i) * (3 * temp5 - temp5^3) * temp4(i , j);
            end
        end
        % 计算E对c、q的偏导数
        utoU = zeros(1, n);
        for i = 1 : 1 : n
            utoU(i) = (y(i) - u) / temp2; % temp2 = sigama(U)
        end
        [Utoc, Utoq] = Utocq(g, x, c, q, m, n, p);
        Etoc = zeros(m, n);
        Etoq = zeros(m, n);
        for i = 1 : 1 : m
            for j = 1 : 1 : n
                temp6 = temp1 * utoU(j);
                Etoc(i, j) = temp6 * Utoc(i, j);
                Etoq(i, j) = temp6 * Utoq(i, j);
            end
        end
        % 对参数修正
        nw = w - rate * Etow + mom * (w - pw);
        na = a - rate * Etoa + mom * (a - pa);
        nb = b - rate * Etob + mom * (b - pb);
        nc = c - rate * Etoc;
        nq = q - rate * Etoq;
        % 修改参数t-1,t
        pw = w; w = nw;
        pa = a; a = na;
        pb = b; b = nb;
        c = nc;
        q = nq;
    end
end
toc % 结束计时,并显示时间
figure(1)
% 图形显示统计信息
k = 1 : 1 : num_yangben;
ttu = tu(epoch, :);
plot(k, result, '-', k, ttu, '-r')
legend('样本集结果', '样本集预测值')
title('训练结果');
xlabel('样本');
ylabel('优先级');
%%============================================================'
%%测试
%%===========================================================
for loop2 = 1 : 1 : num_test
        % 初始化中间数据
        x = zeros(1, m);
        g = zeros(m, n);
       
        % 计算第三层节点的输出,同时记录第三层节点的选择信息
        for i = 1 : 1 : n
            [min, which] = fuzzy(g, m, i);
            U(i) = min;
            p(i) = which;
        end
        % 计算第四层节点的输出
        for i = 1 : 1 : n
            for j = 1 : 1 : m
                W(i) = W(i) + wavelet(x(j), a(i, j), b(i, j));
            end
        end
        y = w .* W;
        % 计算最终的输出
        result_test(loop2) = defuzz(U, y, n);
end
figure(2)
% 图形显示测试信息
k = 1 : 1 : num_test;
plot(k, u_test(:,6), 'g',k, result_test, 'r')
legend('测试集结果', '测试集预测值')
title('测试结果');
xlabel('样本');
ylabel('优先级');


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196

三、运行结果

在这里插入图片描述
在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]胡立伟,凌浩晗,杨锦青,赵雪亭,尹宇,田海龙.基于模糊小波神经网络的营运客车运行风险评估模型研究[J].安全与环境学报. 2020,20(03)

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/122029096

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。