Code covered by the BSD License  

Highlights from
Discriminant Analysis Programme

image thumbnail
from Discriminant Analysis Programme by Bartolomeu Rabacal
Discrimination and Classification of data to and from groups with classical/robust estimation

crossValidation(model, m_dap)
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)])

Contact us at files@mathworks.com