annotate toolboxes/distance_learning/mlr/util/soft_classify.m @ 0:cc4b1211e677 tip

initial commit to HG from Changeset: 646 (e263d8a21543) added further path and more save "camirversion.m"
author Daniel Wolff
date Fri, 19 Aug 2016 13:07:06 +0200
parents
children
rev   line source
Daniel@0 1 function Ypredict = soft_classify(W, test_k, Xtrain, Ytrain, Xtest, Testnorm)
Daniel@0 2 % Ypredict = soft_classify(W, test_k, Xtrain, Ytrain, Xtest, Testnorm)
Daniel@0 3 %
Daniel@0 4 % W = d-by-d positive semi-definite matrix
Daniel@0 5 % test_k = k-value to use for KNN
Daniel@0 6 % Xtrain = d-by-n matrix of training data
Daniel@0 7 % Ytrain = n-by-1 vector of training labels
Daniel@0 8 % Xtest = d-by-m matrix of testing data
Daniel@0 9 % Testnorm= m-by-#kernels vector of k(i,i) for each i in test
Daniel@0 10 %
Daniel@0 11
Daniel@0 12 addpath('cuttingPlane', 'distance', 'feasible', 'initialize', 'loss', ...
Daniel@0 13 'metricPsi', 'regularize', 'separationOracle', 'util');
Daniel@0 14
Daniel@0 15 [d, nTrain, nKernel] = size(Xtrain);
Daniel@0 16 nTest = size(Xtest, 2);
Daniel@0 17 test_k = min(test_k, nTrain);
Daniel@0 18
Daniel@0 19 if nargin < 7
Daniel@0 20 Testnorm = [];
Daniel@0 21 end
Daniel@0 22
Daniel@0 23 % Build the distance matrix
Daniel@0 24 [D, I] = mlr_test_distance(W, Xtrain, Xtest, Testnorm);
Daniel@0 25
Daniel@0 26 % Compute label agreement
Daniel@0 27 Ypredict = histc(Ytrain(I(1:test_k,:)), unique(Ytrain)');
Daniel@0 28
Daniel@0 29 end
Daniel@0 30
Daniel@0 31
Daniel@0 32 function [D,I] = mlr_test_distance(W, Xtrain, Xtest, Testnorm)
Daniel@0 33
Daniel@0 34 % CASES:
Daniel@0 35 % Raw: W = []
Daniel@0 36
Daniel@0 37 % Linear, full: W = d-by-d
Daniel@0 38 % Single Kernel, full: W = n-by-n
Daniel@0 39 % MKL, full: W = n-by-n-by-m
Daniel@0 40
Daniel@0 41 % Linear, diagonal: W = d-by-1
Daniel@0 42 % Single Kernel, diagonal: W = n-by-1
Daniel@0 43 % MKL, diag: W = n-by-m
Daniel@0 44 % MKL, diag-off-diag: W = m-by-m-by-n
Daniel@0 45
Daniel@0 46 [d, nTrain, nKernel] = size(Xtrain);
Daniel@0 47 nTest = size(Xtest, 2);
Daniel@0 48
Daniel@0 49 if isempty(W)
Daniel@0 50 % W = [] => native euclidean distances
Daniel@0 51 D = mlr_test_distance_raw(Xtrain, Xtest, Testnorm);
Daniel@0 52
Daniel@0 53 elseif size(W,1) == d && size(W,2) == d
Daniel@0 54 % We're in a full-projection case
Daniel@0 55 D = setDistanceFullMKL([Xtrain Xtest], W, nTrain + (1:nTest), 1:nTrain);
Daniel@0 56
Daniel@0 57 elseif size(W,1) == d && size(W,2) == nKernel
Daniel@0 58 % We're in a simple diagonal case
Daniel@0 59 D = setDistanceDiagMKL([Xtrain Xtest], W, nTrain + (1:nTest), 1:nTrain);
Daniel@0 60
Daniel@0 61 elseif size(W,1) == nKernel && size(W,2) == nKernel && size(W,3) == nTrain
Daniel@0 62 % We're in DOD mode
Daniel@0 63 D = setDistanceDODMKL([Xtrain Xtest], W, nTrain + (1:nTest), 1:nTrain);
Daniel@0 64
Daniel@0 65 else
Daniel@0 66 % Error?
Daniel@0 67 error('Cannot determine metric mode.');
Daniel@0 68
Daniel@0 69 end
Daniel@0 70
Daniel@0 71 D = full(D(1:nTrain, nTrain + (1:nTest)));
Daniel@0 72 [v,I] = sort(D, 1);
Daniel@0 73 end
Daniel@0 74
Daniel@0 75
Daniel@0 76
Daniel@0 77 function D = mlr_test_distance_raw(Xtrain, Xtest, Testnorm)
Daniel@0 78
Daniel@0 79 [d, nTrain, nKernel] = size(Xtrain);
Daniel@0 80 nTest = size(Xtest, 2);
Daniel@0 81
Daniel@0 82 if isempty(Testnorm)
Daniel@0 83 % Not in kernel mode, compute distances directly
Daniel@0 84 D = 0;
Daniel@0 85 for i = 1:nKernel
Daniel@0 86 D = D + setDistanceDiag([Xtrain(:,:,i) Xtest(:,:,i)], ones(d,1), ...
Daniel@0 87 nTrain + (1:nTest), 1:nTrain);
Daniel@0 88 end
Daniel@0 89 else
Daniel@0 90 % We are in kernel mode
Daniel@0 91 D = sparse(nTrain + nTest, nTrain + nTest);
Daniel@0 92 for i = 1:nKernel
Daniel@0 93 Trainnorm = diag(Xtrain(:,:,i));
Daniel@0 94 D(1:nTrain, nTrain + (1:nTest)) = D(1:nTrain, nTrain + (1:nTest)) ...
Daniel@0 95 + bsxfun(@plus, Trainnorm, bsxfun(@plus, Testnorm(:,i)', -2 * Xtest(:,:,i)));
Daniel@0 96 end
Daniel@0 97 end
Daniel@0 98 end
Daniel@0 99