activeLearningLinGPemoc.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #! /usr/bin/python
  2. import numpy
  3. import pickle
  4. import sys
  5. import os
  6. sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),os.pardir))
  7. import helperFunctions
  8. import activeLearningLinGPprototype
  9. class Classifier(activeLearningLinGPprototype.ClassifierPrototype):
  10. def __init__(self,
  11. sigmaN = 0.00178,
  12. usePde = True,
  13. configFile=None):
  14. activeLearningLinGPprototype.ClassifierPrototype.__init__(self, sigmaN=sigmaN, configFile=configFile)
  15. self.usePde = helperFunctions.getConfig(configFile, 'activeLearning', 'usePde', usePde, 'bool', True)
  16. # x.shape = (number of samples, feat dim)
  17. def calcEMOC(self, x, allX=None):
  18. if allX is None:
  19. allX = numpy.append(self.X, x, axis=0)
  20. containsNoise = (self.yUni == -1).any()
  21. tmpVec1 = self.invCreg*x.T
  22. tmpVec2 = numpy.sum(numpy.multiply(x.T,tmpVec1), axis=0)
  23. sigmaF = self.calcSigmaF(x, tmpVec2)
  24. infY = self.infer(x, containsNoise)
  25. probs = self.calcProbs(x, infY, sigmaF)
  26. term1 = 1.0/(1.0 + tmpVec2)
  27. term2 = numpy.sum(numpy.absolute(allX*tmpVec1), axis=0)
  28. pro = numpy.absolute(infY - 1)
  29. contra = numpy.absolute(infY + 1)
  30. diff = numpy.repeat(numpy.sum(contra,axis=1),contra.shape[1],axis=1)
  31. diff = (diff - contra + pro)
  32. term3 = numpy.sum(numpy.multiply(probs,diff),axis=1)
  33. return numpy.multiply(numpy.multiply(term1, term2).T, term3)
  34. # x.shape = (number of samples, feat dim)
  35. def calcEMOCpde(self, x):
  36. allX = numpy.append(self.X, x, axis=0)
  37. scores = self.calcEMOC(x, allX)
  38. density = x*numpy.mean(allX, axis=0).T
  39. return numpy.multiply(scores, density)
  40. # x.shape = (number of samples, feat dim)
  41. def calcAlScores(self, x):
  42. if self.usePde:
  43. return self.calcEMOCpde(x)
  44. else:
  45. return self.calcEMOC(x)