function malclassificationList = crossValidation(model, m_dap)
% Cross-Validation
% MacLachlan, G.J. Discriminant Analysis and Statistical Pattern
% Recognition, Wiley
malclassificationList = cell([1, m_dap.constants.numGrp]);
disp(['Starting Cross-Validation ', datestr(now)])
for i = 1:m_dap.constants.numGrp
for j = 1:m_dap.constants.numElemPerGrp(i)
dR = []; % Discriminant Rule
dataElem = m_dap.datasets.dataPerGroups{i}(j,:);
if strcmp(model, 'linear')
% invCov = m_dap.modeledInvCovList.linear{1};
tempCovList = m_dap.covList;
tempCovList{i} = cov(m_dap.datasets.dataPerGroups{i}([1:j-1 j+1:end],:));
pooledCov = computeLinearModel(tempCovList, m_dap.constants);
invCov = inv(pooledCov);
for k = 1:m_dap.constants.numGrp
% cvCoef = linearCVCoefficent(invCov, dataElem, k, i, m_dap); %TODO: check Cross Validation (leave-one-out) functionality
cvCoef = 1;
dR(k) = linearRule(m_dap.meanList{k}, invCov, dataElem, m_dap.constants.aprioriProb(k), cvCoef);
end
elseif strcmp(model, 'cpc')
tempCovList = m_dap.covList;
tempCovList{i} = cov(m_dap.datasets.dataPerGroups{i}([1:j-1 j+1:end],:));
cpcCovList = computeCPCModel(tempCovList, m_dap.constants);
tempInvCovList = computeInvCovList(cpcCovList, m_dap.constants.numGrp);
cvCoef.D = 1;
cvCoef.detD = 1;
for k = 1:m_dap.constants.numGrp
dR(k) = quadraticRule(m_dap.meanList{k}, tempInvCovList{k}, dataElem, m_dap.constants.aprioriProb(k), cvCoef);
end
elseif strcmp(model, 'proportional')
tempCovList = m_dap.covList;
tempCovList{i} = cov(m_dap.datasets.dataPerGroups{i}([1:j-1 j+1:end],:));
proportionalCovList = computeProportionalModel(tempCovList, m_dap.constants);
tempInvCovList = computeInvCovList(proportionalCovList, m_dap.constants.numGrp);
cvCoef.D = 1;
cvCoef.detD = 1;
for k = 1:m_dap.constants.numGrp
dR(k) = quadraticRule(m_dap.meanList{k}, tempInvCovList{k}, dataElem, m_dap.constants.aprioriProb(k), cvCoef);
end
else
tempInvCovList = m_dap.invCovList;
tempInvCovList{i} = inv(cov(m_dap.datasets.dataPerGroups{i}([1:j-1 j+1:end],:)));
for k = 1:m_dap.constants.numGrp
% cvCoef = quadraticCVCoefficent(m_dap.invCovList{k},dataElem, k, i, m_dap); % TODO: check Cross Validation (leave-one-out) functionality
cvCoef = struct('D', 1, 'detD', 1);
dR(k) = quadraticRule(m_dap.meanList{k}, tempInvCovList{k}, dataElem, m_dap.constants.aprioriProb(k), cvCoef);
end
end
[dummy, group] = max(dR);
if group ~= i
malclassificationList{i} = [malclassificationList{i}, j];
end
end
end
disp(['Cross-Validation done ', datestr(now)])