调试新的crossval函数:MATLAB
我一直在自己编写一个crossval()函数,因为调试新的crossval函数:MATLAB,matlab,debugging,cross-validation,Matlab,Debugging,Cross Validation,我一直在自己编写一个crossval()函数,因为MATLAB上的crossval()不允许我尝试不同的(自定义)损失/错误度量。然而,我得到的损失估计似乎很小,我无法找出哪里出了问题 我使用的代码如下: function Loss_est = CV(fun1,fun2,data,k) K = crossvalindex(data,k); Loss = zeros(size(K,2),1); for j1 = 1:size(K,2) Xtest = K{j1}; Xtest =
MATLAB
上的crossval()
不允许我尝试不同的(自定义)损失/错误度量。然而,我得到的损失估计似乎很小,我无法找出哪里出了问题
我使用的代码如下:
function Loss_est = CV(fun1,fun2,data,k)
K = crossvalindex(data,k);
Loss = zeros(size(K,2),1);
for j1 = 1:size(K,2)
Xtest = K{j1};
Xtest = [ones(size(Xtest,1),1) Xtest(:,1:end-1)];
ytest = Xtest(:,end);
K1 = K;
K1{j1}=[];
Xtrain = cell2mat(K1(1,:)');
Xtrain = [ones(size(Xtrain,1),1) Xtrain(:,1:end-1) ];
ytrain = Xtrain(:,end);
ynew = Xtest*fun1(ytrain,Xtrain);
Loss(j1,1) = fun2(ynew,ytest);
end
Loss(isnan(Loss))=[];
Loss_est = mean(Loss);
在这里,corssvalindex函数获取数据,并在随机化数据行后将数据划分为单元格
%% Temp_crossvalidation indexing
function [K,edges] = crossvalindex(data,k)
r = size(data,1);
id = randperm(r);
data_1 = data(id,:);
% Edges
edges = 1:round(r/k):r+1;
if numel(edges) < k+1
edges = [edges r+1];
end
% Index-ed and partition
[~,idx] = histc(id,edges);
K = cell(1,numel(edges-1));
for i = 1:numel(edges-1)
K{i} = data_1(idx == i,:);
end
end
我认为您还需要发布
crossvalindex
的代码。还有一个旁注,fun1
和fun2
是糟糕的输入参数名称!为什么不fun\u train
或fun\u model
和fun\u err
或其他什么?在删除NaN
值之前,您也调试并检查了Loss
矩阵的值吗?嘿,丹。查看crossvalindex
的代码。哈哈,我会考虑重新命名整件事。
data = randi(1000,100,10);
fun1 = @(x,y) regress(x,y);
fun2 = @(x,y) sum(abs(y-x));
k = 10;
Loss_est = CV(fun1,fun2,data,k);
Loss_est =
5.4346e-26