def extractFeatures(self, tasks): interactVec = Metric.interacMetric(tasks) moments = self.computeMoments(tasks) fourier = self.computeFourier(tasks) norm = np.linalg.norm(moments) moments = moments / (norm + 1e-15) norm = np.linalg.norm(fourier) fourier = fourier / (norm + 1e-15) features = moments.tolist() + fourier.tolist() # Idea to improve the feature vector # if necessary #nWeaklyInter = len([inter for inter in interacMetric if inter >= 1.0/4]) #nInter = len([inter for inter in interacMetric if inter >= 1.0/2]) norm = np.linalg.norm(features) # normalize the features # to make learning more robust features = features / (norm + 1e-15) self.features = features return self.features
def computeMoments(self, tasks): interactVec = Metric.interacMetric(tasks) # use the counting measure n = len(interactVec) # note that we work with the count measure, # thus the following moment computation is # correct for i in xrange(1,WorkloadFeatures.NumMoment+1): self.moments[i-1] = sum([inter**i for inter \ in interactVec ])/float(n) return self.moments
def computeFourier(self, tasks): interactVec = Metric.interacMetric(tasks) assert len(tasks) > 0 coeff = list(fft(interactVec)) # frequency zero corresponding to # the integral of the original signal coeff[0] = 0 coeff = np.abs(coeff) maxFreq = np.argmax(coeff) maxCoeff = np.max(coeff) n = float(len(coeff)) self.fourier = [ maxFreq/n, maxCoeff ] return self.fourier