C# + Matlab 实现计件工时拟合

 

工序工时由该工序的工艺参数决定,有了工时后乘以固定因子就是计件工资。一般参考本地小时公式以及同类小时工资并考虑作业的风险等因素给出固定因子

下面是样本数据:

注意样本数据要近可能全面,比方这里会交换L与R后做为另一组样本数据一起交给系统训练

C# + Matlab 实现计件工时拟合

打钩的数据会抽取来训练,WTime是目标,所以5个输入1个输出。

训练代码

C# + Matlab 实现计件工时拟合
clc
clear
excel=xlsread('frmZJ_KB_SalaryParamAdmin2011140841.xls');
% 训练集——个样本
P_Train=excel(:,[4 5 11 7 8])';  %注意运算时需要转置矩阵
T_Train=excel(:,9)';
% 测试集——个样本
rndSample=randperm(size(excel,1),500); %随机选择100个作为样本
P_Test=P_Train(:,rndSample);
T_Test=T_Train(:,rndSample);
%% III. 数据归一化
[p_train, ps_input] = mapminmax(P_Train,0,1);
p_test = mapminmax('apply',P_Test,ps_input);
save('ps_input.mat','ps_input');
[t_train, ps_output] = mapminmax(T_Train,0,1);
save('ps_output.mat','ps_output')
N = size(P_Test,2);
%% IV. BP神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newff(p_train,t_train,60);

%%
% 2. 设置训练参数
net.trainParam.epochs = 10000;
net.trainParam.goal = 1e-5;
net.trainParam.lr = 0.01;

%%
% 3. 训练网络
net = train(net,p_train,t_train);
save('ZJPrediction.mat','net');
%%
% 4. 仿真测试
t_sim = sim(net,p_test);

%%
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);


%% V. 性能评价
%%
% 1. 相对误差error
error = abs(T_sim - T_Test)./T_Test;

%%
% 2. 决定系数R^2
R2 = (N * sum(T_sim .* T_Test) - sum(T_sim) * sum(T_Test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_Test).^2) - (sum(T_Test))^2)); 

%%
% 3. 结果对比
result = [T_Test' T_sim' error']

%% VI. 绘图
figure
plot(1:N,T_Test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('输出值')
string = {'测试集预测结果对比';['R^2=' num2str(R2)]};
title(string)
View Code

训练号的模型要保存起来,还有归一化参数,下面3个打钩的文件要发布到生产环境中

C# + Matlab 实现计件工时拟合

下面是需要封成dll的函数,里面采用了绝对路径,因为分装成Windows Service后matlab的工作目录会在C盘下的临时目录

C# + Matlab 实现计件工时拟合
function r=PredictionZJWTime(d)
load('D:\MatlabServer\ps_input.mat','ps_input');
load('D:\MatlabServer\ps_output.mat','ps_output');
load('D:\MatlabServer\ZJPrediction.mat','net');
P_Test=d';
p_test = mapminmax('apply',P_Test,ps_input);
%%
% 4. 仿真测试
t_sim = sim(net,p_test);

%%
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);
r=[d T_sim' T_sim'*0.0062];
end
View Code

下面是在matlab环境下厕所封装的函数

C# + Matlab 实现计件工时拟合
clc
clear
excel=xlsread('frmZJ_KB_SalaryParamAdmin2011120839.xls');
% 训练集——个样本
P_Train=excel(:,[4 5 11 7 8])';  %注意运算时需要转置矩阵
T_Train=excel(:,9)';
% 测试集——个样本
rndSample=randperm(size(excel,1),100); %随机选择100个作为样本
P_Test=P_Train(:,rndSample);
T_Test=T_Train(:,rndSample);

T_Sim=PredictionZJWTime(P_Test');
T_Sim(:,6) - T_Test'
View Code

 

上一篇:hdu-3333 Turing Tree 离线区间+树状数组(区间不同数的和)


下一篇:ubuntu 安装 pytesseract 模块进行图片内容识别