2016-10-10 149 views
0

我在默认情况下使用了fitrsvm,交叉验证和KFold验证。如何在MATLAB中计算MAPE和DS

%%In sample validation. 
rng default ; 
mdl = fitrsvm(X,Y, 'Standardize',true); 
loss = resubLoss(mdl) 
%% out of sample validation with 80% traning and 20% validation  
CVmdl = crossval(mdl,'Holdout',0.2); 
CVloss = kfoldLoss(CVmdl) 
%% 10Fold Cross Validation Model 
KFmdl = crossval(mdl); 
KFloss = kfoldLoss(KFmdl) 

我需要计算这些模型的MAPE和方向对称性(DS)。在Matlab中是否有内建函数(如损失或KfoldLoss)?或者我需要实现这些功能?

+0

你能告诉我关闭的原因,以便我可以避免它的未来? – Abrar

回答

0

在这里我实现了两个方向对称(DS)和平均绝对误差百分比(MAPE)作为功能

function mape(Y, Ypredict, indxtest) 
smape = 0; 

    if isempty(indxtest) 
     for i = 1 :length(Y) 
      smape = smape + (abs((Ypredict(i) - Y(i)))/Y(i)); 
     end 
    else 
     j = find(indxtest); 
     for i = 1 :length(j) 
      smape = smape + (abs((Ypredict(i) - Y(j(i))))/Y((j(i)))); 
     end 
    end 

mape = smape * 100/length(Y) 
end 
------------------------------------------------------- 
function ds(Y, Ypredict, indxtest) 
sds = 0; 
if isempty(indxtest) 
    for i = 2 :length(Y) 
     if (((Y(i)-Y(i-1))*(Ypredict(i)-Ypredict(i-1))) > 0) 
     sds = sds + 1; 
     end 
    end 
else 
    j = find(indxtest); 
    for i = 2 :length(j) 
     if (((Y(j(i))-Y(j(i-1)))*(Ypredict((i))-Ypredict(i-1))) > 0) 
      sds = sds + 1; 
     end 
    end 
end 
ds = sds * 100/length(j) 
end 

虽然这个工作对我很好,但如果有人可以帮助我要么提高它我会很高兴最大限度地减少线路数量或提高效率。