⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wx_performance_evaluation.m

📁 用BP神经网络实现机械零部件的性能评价
💻 M
字号:
function wx_performance_evaluation(data_source,data_name,data_result_name,train_epochs,hidden_layer_neural_num,name_train,name_simulate,max_rand_train_num,T1,load_or_train)
% wx_performance_evaluation('E:\data_045\','result_data.mdb','result.mdb',5000,10,[2 4 5],[1 3],10,[0.99,0.97,0.94,0.08,0.05,0.01],-1)
% total_table_num=9;                                                   % 表的总数;
% rand_total_num=4;                                                    % 随机生成的用于训练的表格数;
% data_source='E:\wangxing\data_045\';                        % 获得要使用数据的路径;
% data_name='result_data.mdb';
% data_result_name='result.mdb';
% train_epochs=5000;
% hidden_layer_neural_num=10;
% max_rand_train_num=1;
% load_or_train==1;等于1为load,非1为训练;
% name_train=[2 4 5];
% name_simulate=[1 3];
close all;
clc;
parameters_num=3;  %  设定输入特征的数目;
data_path=[data_source,data_name]; % 组合数据路径;
scale_value=[1000,1000,50000];                                          % 每个特征的比例系数;
colum=char('MAX_STRESS','min_stress','sum_stress');               % 每个特征的名称;
cycle=size(colum);                                                         % cycle为循环终止次数;
cite1='"';  % 在数据库连接中要使用的双引号;
cite2=''''; % 在数据库连接中要使用的单引号;
T=T1;                                                                      % 首先赋值目标参数T;
for i=1:length(name_train)
    table_name=['number',num2str(name_train(i))];                                 % 组合为表的名字;
    for j=1:parameters_num
        A=abs(wx_getarray(data_path,table_name,colum(j,:),-1)/scale_value(j));           % 调用wx_getarray函数获得一列的数据;
        totalnum=size(A);                                                  % 获得A的大小;
        feature(j,(i-1)*6+1)=A(1,1);                        % 一个表格中挑出的第一组数据;
        feature(j,(i-1)*6+2)=A(1,5);                        % 一个表格中挑出的第二组数据;
        feature(j,(i-1)*6+3)=A(1,10);                       % 一个表格中挑出的第三组数据;
        feature(j,(i-1)*6+4)=A(1,totalnum(1,2)-9);          % 一个表格中挑出的第四组数据;
        feature(j,(i-1)*6+5)=A(1,totalnum(1,2)-4);          % 一个表格中挑出的第五组数据;
        feature(j,(i-1)*6+6)=A(1,totalnum(1,2));            % 一个表格中挑出的第六组数据;
        clear ('A','totalnum');
    end
    if i>1,T=[T,T1];end                                                    % 组合目标参数;
end
range_inputvalue=zeros(parameters_num,1);                                % 确定输入向量的下限值;
range_inputvalue(:,2)=ones(parameters_num,1);                              % 确定输入向量的上限值;
for experiment_cycle_num=1:max_rand_train_num
    net=newff(range_inputvalue,[hidden_layer_neural_num,1],{'tansig','logsig'},'traincgf');           % 创建BP网络

    net.trainParam.epochs=train_epochs;                                        % 设置训练次数;
    net.trainParam.goal=0;                                                     % 训练设置目标;
    net.trainParam.show=20000;                                                  % 设置200次显示一次;
    net.trainParam.lr=0.1;                                                     % 设置学习率;
    net.trainParam.minstep=1e-10;

    % 确定保存数据及图像的路径;
    goal_source=[data_source,'evaluation\',num2str(length(name_train)+length(name_simulate)),'table_',num2str(parameters_num),...
        'parms_',num2str(train_epochs),'epochs_',num2str(hidden_layer_neural_num),'neural\'];
    % 训练BP网络,获得权值和阀值;
    if load_or_train==1
        load([goal_source,'parameters_',num2str(experiment_cycle_num),'.mat']);
        net.IW{1,1}=IW11;
        net.b{1}=b1;
        net.LW{1,1}=LW11;
        net.b{2}=b2;
        net.LW{2,1}=LW21;
    else
        net=train(net,feature,T);
        % 记录网络的参数,并保存下来;
        IW11=net.IW{1,1};
        b1=net.b{1};
        LW11=net.LW{1,1};
        b2=net.b{2};
        LW21=net.LW{2,1};
        save([goal_source,'parameters_',num2str(experiment_cycle_num),'.mat'],'IW11','b1','LW11','b2','LW21'); % 保存经过训练后网络的参数;
    end

    % 对表进行仿真,并绘出图形;
    total_table=[name_train name_simulate];
    for k=1:length(total_table)
        % 组合表名;
        table_name=['number',num2str(total_table(k))];
        % 获取每一个特征的所有数据;
        for j=1:parameters_num
            feature_simulate(j,:)=abs(wx_getarray(data_path,table_name,colum(j,:),-1)/scale_value(j));
        end
        y=sim(net,feature_simulate); % 对读到的数据特征进行仿真;
        % 把仿真的结果存入到对应的表中;
        % 调用wx_manipulate_access函数在已建立的result.mdb中创建相应表名
        if experiment_cycle_num==1
            % 如果experiment_cycle_num==1为真,则创建数据表名及相应的字段名;
            sql=['create table ',table_name,'(cycle_num text,reliablity_1 text)'];
            wx_manipulate_access(goal_source,data_result_name,sql);
            % 把仿真的结果存储到指定的Access数据表中;
            for j=1:length(y)
                sql=['insert into ',table_name, '(cycle_num,reliablity_',num2str(experiment_cycle_num),') values (',cite2,num2str(j),cite2,',',cite2,num2str(y(j)),cite2,')'];
                wx_manipulate_access(goal_source,data_result_name,sql);
            end
            % 如果
        else
            sql=['alter table ',table_name,' add reliablity_',num2str(experiment_cycle_num),' text'];
            wx_manipulate_access(goal_source,data_result_name,sql);
            for j=1:length(y);
                sql=['update ',table_name,' set ','reliablity_',num2str(experiment_cycle_num),'=',cite2,num2str(y(j)),cite2];
                sql=[sql,' where cycle_num=',cite2,num2str(j),cite2];
                wx_manipulate_access(goal_source,data_result_name,sql);
            end
        end
        % 横坐标x为寿命时间;
        x=wx_getarray(data_path,table_name,'cyc_no',-1);
        figure('name',[table_name,'_',num2str(experiment_cycle_num)],'numbertitle','off');
        plot(x,y,'--rs','Marker','*');xlabel('时间','FontWeight','Bold','Fontsize',9);
        ylabel('概率','FontWeight','Bold','Fontsize',9);
        title(['第',num2str(total_table(k)),'组数据仿真'],'FontWeight','Bold','Fontsize',10);
        % 把图形保存到指定的路径中;
        saveas(gcf,[goal_source,[table_name,'_',num2str(experiment_cycle_num)],'.fig']);
        clear('feature_simulate','y','x');
        close all
    end
    clear('net')
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -