基于matlab关于神经网络训练数据的问题

问题流程如下图所示

w与q为容量相等的列向量
q与w点乘得到Q
每个q会算出一个AC
当AC不小于20时直接输出,当AC小于20时,反回初始w,用神经网络更新w中的元素,得到新的w再重复运算,直到满足条件

目前遇到的问题为,神经网络的种类和框架不太明白

编码软件:本人更加熟悉matlab的编程,希望答主能用matlab编码,最好能带注释

下面的代码为我的基础代码
需解决的问题为倒数两行要插入如流程图所示的神经网络循环训练,得到需要的AC值
AC的期望值为20

img

%%初始条件
Y=2;M=1;fs=4000;T=4;

%%计算每一组数据的AC
for n=1:T*fs%总共T*fs组数据,一组数据2M*Y个,最后会得到T*fs个AC值
    t=n/fs;
    xb1=0.5*sin(2*pi*15*t);xb2=2*sin(2*pi*40*t);xd1=2*sin(2*pi*15*t);xd2=0.5*sin(2*pi*40*t);
    yb1=fft(xb1);yb2=fft(xb2);yd1=fft(xd1);yd2=fft(xd2);
    yb=[yb1,yb2];yd=[yd1,yd2];
    Ab=abs(yb);Ad=abs(yd);
    Gb=reshape(Ab,M,Y);Gd=reshape(Ad,M,Y);
    Rb=Gb'*Gb/M;Rd=Gd'*Gd/M;
    %解权向量q,求AC
    [V,D]=eig(Rd'*Rb);
    eigenvalue=diag(D);
    lamda=max(eigenvalue);
    for i=1:length(Rd'*Rb)
        if lamda==eigenvalue(i)
            break;
        end 
    end
    q=V(:,i);
    AC(n)=10*log10((q'*Rb*q)/(q'*Rd*q));
end


定义一个变量来存储AC的总和,每次计算AC时将其加到总和中,总和在除以AC的数量,试一试训练过程这么写:

%定义常量
Y = 2;
M = 1;
fs = 4000;
T = 4;

%定义神经网络
net = feedforwardnet(10); %使用前馈神经网络
net.trainFcn = 'trainlm'; %使用Levenberg-Marquardt算法进行训练
net.layers{1}.transferFcn = 'tansig'; %第一层使用tansig激活函数

%初始化权重和AC总和
w = ones(1, T * fs);
ac_sum = 0;

%% 计算每一组数据的AC
for n = 1 : T * fs %总共 T*fs 组数据, 一组数据 2M*Y 个, 最后会得到 T*fs 个 AC 值
    t = n / fs;
    xb1 = 0.5 * sin(2*pi*15*t); xb2 = 2 * sin(2*pi*40*t); xd1 = 2 * sin(2*pi*15*t); xd2 = 0.5 * sin(2*pi*40*t);
    yb1 = fft(xb1); yb2 = fft(xb2); yd1 = fft(xd1); yd2 = fft(xd2);
    yb = [yb1, yb2]; yd = [yd1, yd2];
    Ab = abs(yb); Ad = abs(yd);
    Gb = reshape(Ab,M,Y); Gd = reshape(Ad,M,Y); % 将向量重新排列成矩阵
    Rb = Gb' * Gb / M; Rd = Gd' * Gd / M; % 计算协方差矩阵
    [V,D] = eig(Rd' * Rb);
    eigenvalue = diag(D);
    lamda = max(eigenvalue);
    for i = 1 : length(Rd' * Rb)
        if lamda == eigenvalue(i)
            break;
        end
    end
    q = V(:,i);
    AC(n) = 10*log10((q' * Rb * q) / (q' * Rd * q));

    %将AC加到总和中
    ac_sum = ac_sum + AC(n);

    %神经网络循环训练
    if AC(n) < 20
        input = w(n);
        output = AC(n);
        [net,~] = train(net, input, output); %更新权重
        w(n+1) = net(input); %传入下一个权重
    else
        w(n+1) = w(n);
    end
end

%计算期望值
ac_mean = ac_sum / (T * fs);

%输出期望值
fprintf('AC期望值为:%f\\n', ac_mean);