update_multiclass_gp.m 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. function model = update_multiclass_gp(modelOld, kss, ksNewSample, newLabel)
  2. % Update a multi-class GP model
  3. %
  4. % function model = update_multiclass_gp(modelOld, kss, ksNewSample, newLabel)
  5. %
  6. % INPUT: modelOld -- the old gp-multiclass model (relevant: noise, L, y)
  7. % kss -- self similarity of new example
  8. % ksNewSample -- kernel values between new and old training examples
  9. % newLabel -- label of new example
  10. % Copyright (c) by Alexander Freytag, 2013-11-13.
  11. %%
  12. % Cholesky update to include the selected sample
  13. l = modelOld.L\ksNewSample;
  14. lss = sqrt(kss+modelOld.noise-l'*l);
  15. L = [modelOld.L, zeros(length(l),1); l', lss ];
  16. %obtain new labels in a single vector
  17. newLabels = [modelOld.y, newLabel];
  18. % copy all relevant data
  19. model.noise = modelOld.noise;
  20. % store relevant new data
  21. model.L = L;
  22. % obtain unique class labels (length of this vector equals the number of classes)
  23. % Note: we can not re-use the previously known labels, since newLabel
  24. % might contain a completely new class
  25. model.unique_labels = unique(newLabels);
  26. % loop over classes and thus over binary one-vs-all tasks
  27. for k=1:length(model.unique_labels)
  28. % binary label vector for each binary task
  29. current_labels = 2*(newLabels==model.unique_labels(k))-1;
  30. % precompute and store alpha vector for each binary task
  31. model.alpha{k} = L'\(L\current_labels');
  32. end
  33. model.y = newLabels;
  34. end