2015-03-07 2 views
3

У меня возникли проблемы с анализом документации на pybrains по оптимизации их черного ящика. Я ищу для ввода собственной функции оптимизатора веса nn. У Pybrain есть GA, и подъем холма уже реализован. Я не могу скопировать их формат, например, реализовать имитированный отжиг для оптимизации весов nn.
Кто-нибудь знает, как, например, сделать эту функцию отжига, которую можно использовать с помощью pybrain? Как показано здесь, это простой пример использования встроенной функции GA. Как я могу изменить функцию отжига для использования здесь?pybrain black box optimizer оптимизированный имитационный отжиг

def annealingoptimize(domain,costf,T=10000.0,cool=0.95,step=1): 
    # Initialize the values randomly 
    vec=[float(random.randint(domain[i][0],domain[i][1])) 
     for i in range(len(domain))] 

    while T>0.1: 
    # Choose one of the indices 
    i=random.randint(0,len(domain)-1) 

    # Choose a direction to change it 
    dir=random.randint(-step,step) 

    # Create a new list with one of the values changed 
    vecb=vec[:] 
    vecb[i]+=dir 
    if vecb[i]<domain[i][0]: vecb[i]=domain[i][0] 
    elif vecb[i]>domain[i][1]: vecb[i]=domain[i][1] 

    # Calculate the current cost and the new cost 
    ea=costf(vec) 
    eb=costf(vecb) 
    p=pow(math.e,(-eb-ea)/T) 

    print vec,ea 


    # Is it better, or does it make the probability 
    # cutoff? 
    if (eb<ea or random.random()<p): 
     vec=vecb 

    # Decrease the temperature 
    T=T*cool 
    return vec 

##GA EXAMPLE, uses GA(ContinuousOptimizer, Evolution) these two opaque classes.

from pybrain.datasets.classification import ClassificationDataSet 
# below line can be replaced with the algorithm of choice e.g. 
# from pybrain.optimization.hillclimber import HillClimber 
from pybrain.optimization.populationbased.ga import GA 
from pybrain.tools.shortcuts import buildNetwork 

# create XOR dataset 
d = ClassificationDataSet(2) 
d.addSample([0., 0.], [0.]) 
d.addSample([0., 1.], [1.]) 
d.addSample([1., 0.], [1.]) 
d.addSample([1., 1.], [0.]) 
d.setField('class', [ [0.],[1.],[1.],[0.]]) 

nn = buildNetwork(2, 3, 1) 
# d.evaluateModuleMSE takes nn as its first and only argument 
ga = GA(d.evaluateModuleMSE, nn, minimize=True) 
for i in range(100): 
    nn = ga.learn(0)[0] 

ответ

1

Вы можете использовать StochasticHillClimber():

class pybrain.optimization.StochasticHillClimber(evaluator=None, initEvaluable=None, **kwargs)
Стохастический пониженная всегда движется к лучшей точке, но может также пойти хуже с вероятностью, которая уменьшается с увеличением падения пригодности (и зависит по температурному параметру).

temperature
Чем больше температура, тем больше исследующий (менее жадными) он ведет себя.