1. 程式人生 > 實用技巧 >C# + Matlab 實現計件工時擬合

C# + Matlab 實現計件工時擬合

工序工時由該工序的工藝引數決定,有了工時後乘以固定因子就是計件工資。一般參考本地小時公式以及同類小時工資並考慮作業的風險等因素給出固定因子

下面是樣本資料:

注意樣本資料要近可能全面,比方這裡會交換L與R後做為另一組樣本資料一起交給系統訓練

打鉤的資料會抽取來訓練,WTime是目標,所以5個輸入1個輸出。

訓練程式碼

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個打鉤的檔案要釋出到生產環境中

下面是需要封成dll的函式,裡面採用了絕對路徑,因為分裝成Windows Service後matlab的工作目錄會在C盤下的臨時目錄

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環境下廁所封裝的函式

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