def oneSample(self, k): """ produce one new sample and update phi correspondingly """ thesum = 0.0 for i in range(self.mu): thesum += exp(self.basealpha[i]) for i in range(self.mu): self.alpha[i] = exp(self.basealpha[i]) / thesum choosem = drawIndex(self.alpha, tolerant=True) self.chosenCenter[k] = choosem z = mat( multivariate_normal( array(self.x[choosem]).flatten(), self.sigma[choosem])).T self.zs[k] = z self.R[k] = self.evaluateAt(z) # TODO make for all mu if self.importanceSampling: self.rellhood[k] = multivariateNormalPdf(z, self.x[0], self.sigma[0]) logderivbasealpha = zeros((self.mu, 1)) logderivx = zeros((self.mu, self.xdim)) logderivfactorsigma = zeros((self.mu, self.xdim, self.xdim)) for m in range(self.mu): self.sigma[m] = dot(self.factorSigma[m].T, self.factorSigma[m]) if self.mu > 1: relresponsibility = (self.alpha[m] * multivariateNormalPdf( ravel(z), ravel(self.x[m]), self.sigma[m]) / sum( map( lambda mm: self.alpha[mm] * multivariateNormalPdf( ravel(z), ravel(self.x[mm]), self.sigma[mm]), range(self.mu)))) else: relresponsibility = 1.0 if self.mu > 1: logderivbasealpha[m] = relresponsibility * (1.0 - self.alpha[m]) else: logderivbasealpha[m] = 0.0 logderivx[m] = relresponsibility * (self.sigma[m].I * (z - self.x[m])).flatten() A = 0.5 * self.sigma[m].I * (z - self.x[m]) * ( z - self.x[m]).T * self.sigma[m].I - 0.5 * self.sigma[m].I logderivsigma_m = self.blackmagic * relresponsibility * A #0.5 * (A + diag(diag(A))) #* 2.0 logderivfactorsigma[m] = self.factorSigma[m] * (logderivsigma_m + logderivsigma_m.T) #print 'logalpha', logderivbasealpha.flatten(), self.alpha, sum(logderivbasealpha) tmp = self.combineParams(logderivbasealpha, logderivx, logderivfactorsigma) self.phi[k] = tmp
def _updateShaping(self): """ Daan: "This won't work. I like it!" """ assert self.numberOfCenters == 1 possible = self.shapingFunction.getPossibleParameters(self.windowSize) matchValues = [] pdfs = [ multivariateNormalPdf(s, self.mus[0], self.sigmas[0]) for s in self.samples ] for p in possible: self.shapingFunction.setParameter(p) transformedFitnesses = self.shapingFunction(self.fitnesses) #transformedFitnesses /= sum(transformedFitnesses) sumValue = sum([ x * log(y) for x, y in zip(pdfs, transformedFitnesses) if y > 0 ]) normalization = sum( [x * y for x, y in zip(pdfs, transformedFitnesses) if y > 0]) matchValues.append(sumValue / normalization) self.shapingFunction.setParameter(possible[argmax(matchValues)]) if len(self.allsamples) % 100 == 0: print(possible[argmax(matchValues)]) print(fListToString(matchValues, 3))
def oneSample(self, k): """ produce one new sample and update phi correspondingly """ thesum = 0.0 for i in range(self.mu): thesum += exp(self.basealpha[i]) for i in range(self.mu): self.alpha[i] = exp(self.basealpha[i])/thesum choosem = drawIndex(self.alpha, tolerant = True) self.chosenCenter[k] = choosem z = mat(multivariate_normal(array(self.x[choosem]).flatten(), self.sigma[choosem])).T self.zs[k] = z self.R[k] = self.evaluateAt(z) # TODO make for all mu if self.importanceSampling: self.rellhood[k] = multivariateNormalPdf(z, self.x[0], self.sigma[0]) logderivbasealpha = zeros((self.mu, 1)) logderivx = zeros((self.mu, self.xdim)) logderivfactorsigma = zeros((self.mu, self.xdim, self.xdim)) for m in range(self.mu): self.sigma[m] = dot(self.factorSigma[m].T,self.factorSigma[m]) if self.mu > 1: relresponsibility = (self.alpha[m] * multivariateNormalPdf(ravel(z), ravel(self.x[m]), self.sigma[m]) / sum(map(lambda mm: self.alpha[mm]*multivariateNormalPdf(ravel(z), ravel(self.x[mm]), self.sigma[mm]), range(self.mu)))) else: relresponsibility = 1.0 if self.mu > 1: logderivbasealpha[m] = relresponsibility * (1.0 - self.alpha[m]) else: logderivbasealpha[m] = 0.0 logderivx[m] = relresponsibility * (self.sigma[m].I * (z - self.x[m])).flatten() A = 0.5 * self.sigma[m].I * (z - self.x[m]) * (z - self.x[m]).T * self.sigma[m].I - 0.5 * self.sigma[m].I logderivsigma_m = self.blackmagic * relresponsibility * A#0.5 * (A + diag(diag(A))) #* 2.0 logderivfactorsigma[m] = self.factorSigma[m]*(logderivsigma_m + logderivsigma_m.T) #print 'logalpha', logderivbasealpha.flatten(), self.alpha, sum(logderivbasealpha) tmp = self.combineParams(logderivbasealpha, logderivx, logderivfactorsigma) self.phi[k] = tmp
def _produceNewSample(self): """ returns a new sample, its fitness and its densities """ sample = self._generateSample() fit = self.evaluator(sample) if fit >= self.bestEvaluation: self.bestEvaluation = fit self.bestEvaluable = sample.copy() self.allsamples.append(sample) # compute densities, and normalize densities = zeros(self.numberOfCenters) if self.numberOfCenters > 1: for c in range(self.numberOfCenters): densities[c] = self.alphas[c] * multivariateNormalPdf(sample, self.mus[c], self.sigmas[c]) densities /= sum(densities) return sample, fit, densities
def _produceNewSample(self): """ returns a new sample, its fitness and its densities """ sample = self._generateSample() fit = self.evaluator(sample) if fit >= self.bestEvaluation: self.bestEvaluation = fit self.bestEvaluable = sample.copy() self.allsamples.append(sample) # compute densities, and normalize densities = zeros(self.numberOfCenters) if self.numberOfCenters > 1: for c in range(self.numberOfCenters): densities[c] = self.alphas[c] * multivariateNormalPdf( sample, self.mus[c], self.sigmas[c]) densities /= sum(densities) return sample, fit, densities
def _computeDensities(self, sample): """ compute densities, and normalize """ densities = zeros(self.numberOfCenters) for c in range(self.numberOfCenters): if self.diagonalOnly: pdf = product([norm.pdf(x, self.mus[c][i], self.sigmas[c][i]) for i, x in enumerate(sample)]) else: pdf = multivariateNormalPdf(sample, self.mus[c], self.sigmas[c]) if pdf > 1e40: pdf = 1e40 elif pdf < 1e-40: pdf = 1e-40 if isnan(pdf): print('NaN!') pdf = 0. densities[c] = self.alphas[c] * pdf densities /= sum(densities) return densities
def _updateShaping(self): """ Daan: "This won't work. I like it!" """ assert self.numberOfCenters == 1 possible = self.shapingFunction.getPossibleParameters(self.windowSize) matchValues = [] pdfs = [multivariateNormalPdf(s, self.mus[0], self.sigmas[0]) for s in self.samples] for p in possible: self.shapingFunction.setParameter(p) transformedFitnesses = self.shapingFunction(self.fitnesses) #transformedFitnesses /= sum(transformedFitnesses) sumValue = sum([x * log(y) for x, y in zip(pdfs, transformedFitnesses) if y > 0]) normalization = sum([x * y for x, y in zip(pdfs, transformedFitnesses) if y > 0]) matchValues.append(sumValue / normalization) self.shapingFunction.setParameter(possible[argmax(matchValues)]) if len(self.allsamples) % 100 == 0: print((possible[argmax(matchValues)])) print((fListToString(matchValues, 3)))