activeLearningGPprototype.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import math
  2. import scipy
  3. import numpy
  4. import sklearn.kernel_ridge
  5. import sys
  6. import os
  7. sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)),os.pardir))
  8. import helperFunctions
  9. class RegressorPrototype:
  10. def __init__(self, sigmaN=0.01, gamma=None, kernel='rbf', configFile=None, verbose=True):
  11. self.sigmaN = helperFunctions.getConfig(configFile, 'activeLearning', 'sigmaN', sigmaN, 'float', verbose)
  12. self.kernel = helperFunctions.getConfig(configFile, 'activeLearning', 'kernel', kernel, 'str', verbose)
  13. self.gamma = helperFunctions.getConfig(configFile, 'activeLearning', 'gamma', gamma, 'float', verbose)
  14. self.numKernelCores = helperFunctions.getConfig(configFile, 'activeLearning', 'numKernelCores', 1, 'int', verbose)
  15. self.verbose = helperFunctions.getConfig(configFile, 'activeLearning', 'verbose', verbose, 'bool', verbose)
  16. self.K = []
  17. self.alpha = []
  18. self.X = []
  19. self.y = []
  20. self.allowedKernels = ['rbf', 'sigmoid', 'polynomial', 'poly', 'linear', 'cosine']
  21. if self.kernel not in self.allowedKernels:
  22. raise Exception('Unknown kernel %s!'%self.kernel)
  23. def kernelFunc(self, x1, x2=None, gamma=None):
  24. if gamma is not None:
  25. self.gamma = gamma
  26. if self.kernel in ['rbf']:
  27. return numpy.asmatrix(sklearn.kernel_ridge.pairwise_kernels(x1, x2, metric=self.kernel, gamma=self.gamma, n_jobs=self.numKernelCores), dtype=numpy.float)
  28. else:
  29. return numpy.asmatrix(sklearn.kernel_ridge.pairwise_kernels(x1, x2, metric=self.kernel, n_jobs=self.numKernelCores), dtype=numpy.float)
  30. def train(self, X, y, sigmaN=None, gamma=None, kernel=None, numKernelCores=None):
  31. if sigmaN is not None:
  32. if self.verbose:
  33. print 'regressor - switched sigmaN from {} to {}'.format(self.sigmaN, sigmaN)
  34. self.sigmaN = sigmaN
  35. if gamma is not None:
  36. if self.verbose:
  37. print 'regressor - switched gamma from {} to {}'.format(self.gamma, gamma)
  38. self.gamma = gamma
  39. if kernel is not None and kernel in self.allowedKernels:
  40. if self.verbose:
  41. print 'regressor - switched kernel from {} to {}'.format(self.kernel, kernel)
  42. self.kernel = kernel
  43. if numKernelCores is not None:
  44. if self.verbose:
  45. print 'regressor - switched numKernelCores from {} to {}'.format(self.numKernelCores, numKernelCores)
  46. self.numKernelCores = numKernelCores
  47. self.X = X
  48. self.y = y
  49. self.K = self.kernelFunc(X, gamma=self.gamma)
  50. self.alpha = numpy.linalg.solve(self.K + numpy.identity(self.X.shape[0], dtype=numpy.float)*self.sigmaN, self.y)
  51. self.checkVars()
  52. def update(self, x, y):
  53. k = self.kernelFunc(self.X, x)
  54. selfKdiag = self.getSelfKdiag(x)
  55. term1 = 1.0 / (self.calcSigmaF(x, k, selfKdiag) + self.sigmaN)
  56. term2 = numpy.asmatrix(numpy.ones((self.X.shape[0] + 1,x.shape[0])), dtype=numpy.float) * -1.0
  57. term2[0:self.X.shape[0],:] = numpy.linalg.solve(self.K + numpy.identity(self.X.shape[0], dtype=numpy.float)*self.sigmaN, k)
  58. term3 = self.predict(x) - y
  59. self.alpha = numpy.append(self.alpha, numpy.zeros((1,self.alpha.shape[1])), axis=0) + numpy.dot(numpy.dot(term1,term2.T).T,term3)
  60. self.K = numpy.append(numpy.append(self.K, k, axis=1), numpy.append(k.T, selfKdiag, axis=1), axis=0)
  61. self.X = numpy.append(self.X, x, axis=0)
  62. self.y = numpy.append(self.y, y, axis=0)
  63. self.checkVars()
  64. def checkVars(self):
  65. if not numpy.all(numpy.isfinite(self.X)):
  66. raise Exception('not numpy.all(numpy.isfinite(self.X))')
  67. if not numpy.all(numpy.isfinite(self.y)):
  68. raise Exception('not numpy.all(numpy.isfinite(self.y))')
  69. if not numpy.all(numpy.isfinite(self.K)):
  70. raise Exception('not numpy.all(numpy.isfinite(self.K))')
  71. if not numpy.all(numpy.isfinite(self.alpha)):
  72. raise Exception('not numpy.all(numpy.isfinite(self.alpha))')
  73. def predict(self, x):
  74. k = self.kernelFunc(self.X, x)
  75. return numpy.dot(k.T, self.alpha)
  76. def calcSigmaF(self, x, k=None, selfKdiag=None):
  77. if k is None:
  78. k = self.kernelFunc(self.X, x)
  79. if selfKdiag is None:
  80. selfKdiag = self.getSelfKdiag(x)
  81. return selfKdiag - numpy.sum(numpy.multiply(k, numpy.linalg.solve(self.K + numpy.identity(self.K.shape[0], dtype=numpy.float)*self.sigmaN, k)), axis=0).T
  82. def getSelfKdiag(self, x):
  83. selfKdiag = numpy.asmatrix(numpy.empty([x.shape[0],1], dtype=numpy.float))
  84. for idx in range(x.shape[0]):
  85. selfKdiag[idx,:] = self.kernelFunc(x[idx,:])
  86. return selfKdiag
  87. def calcAlScores(self, x):
  88. return None
  89. def chooseSample(self, x):
  90. alScores = self.calcAlScores(x)
  91. if alScores.shape[0] != x.shape[0] or alScores.shape[1] != 1:
  92. raise Exception('alScores.shape[0] != x.shape[0] or alScores.shape[1] != 1')
  93. if not numpy.all(numpy.isfinite(alScores)):
  94. raise Exception('not numpy.all(numpy.isfinite(alScores))')
  95. return numpy.argmax(alScores, axis=0).item(0)