예제 #1
0
 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
예제 #2
0
    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))
예제 #3
0
파일: nes.py 프로젝트: HKou/pybrain
 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
예제 #4
0
파일: fem.py 프로젝트: HKou/pybrain
 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
예제 #5
0
    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
예제 #6
0
파일: fem.py 프로젝트: Angeliqe/pybrain
 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
예제 #7
0
 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
예제 #8
0
파일: fem.py 프로젝트: Angeliqe/pybrain
    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)))