2010-02-18 4 views
1

Следующий код python должен пересекать 2D-сетку (c, g) в некотором специальном порядке, который хранится в «jobs» и «job_queue». Но я не уверен, какой порядок он пытается понять код. Кто-нибудь может рассказать о заказе и дать какое-то объяснение для каждой функции? Спасибо и приветствую!что этот код python пытается сделать

import Queue 

c_begin, c_end, c_step = -5, 15, 2 
g_begin, g_end, g_step = 3, -15, -2 

def range_f(begin,end,step): 
    # like range, but works on non-integer too 
    seq = [] 
    while True: 
     if step > 0 and begin > end: break 
     if step < 0 and begin < end: break 
     seq.append(begin) 
     begin = begin + step 
    return seq 

def permute_sequence(seq): 
    n = len(seq) 
    if n <= 1: return seq 

    mid = int(n/2) 
    left = permute_sequence(seq[:mid]) 
    right = permute_sequence(seq[mid+1:]) 

    ret = [seq[mid]] 
    while left or right: 
     if left: ret.append(left.pop(0)) 
     if right: ret.append(right.pop(0)) 

    return ret 

def calculate_jobs(): 
    c_seq = permute_sequence(range_f(c_begin,c_end,c_step)) 
    g_seq = permute_sequence(range_f(g_begin,g_end,g_step)) 
    nr_c = float(len(c_seq)) 
    nr_g = float(len(g_seq)) 
    i = 0 
    j = 0 
    jobs = [] 

    while i < nr_c or j < nr_g: 
     if i/nr_c < j/nr_g: 
      # increase C resolution 
      line = [] 
      for k in range(0,j): 
       line.append((c_seq[i],g_seq[k])) 
      i = i + 1 
      jobs.append(line) 
     else: 
      # increase g resolution 
      line = [] 
      for k in range(0,i): 
       line.append((c_seq[k],g_seq[j])) 
      j = j + 1 
      jobs.append(line) 
    return jobs 

def main(): 

    jobs = calculate_jobs() 
    job_queue = Queue.Queue(0) 

    for line in jobs: 
     for (c,g) in line: 
      job_queue.put((c,g)) 

main() 

РЕДАКТИРОВАТЬ:

Существует значение для каждого (с, г). Фактически, код должен искать в 2D-сетке (c, g), чтобы найти точку сетки, где значение является наименьшим. Я предполагаю, что код использует какой-то алгоритм эвристического поиска? Исходный код здесь http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/gridsvr/gridregression.py, который является скриптом для поиска алгоритма svm наилучшим значением для двух параметров c и g с минимальной ошибкой проверки.

ответ

2

permute_sequence переупорядочивает список значений таким образом, чтобы среднее значение было первым, затем средняя точка каждой половины, затем середины четырех оставшихся четвертей и т. Д. Так permute_sequence(range(1000)) начинается так:

[500, 250, 750, 125, 625, 375, ...] 

calculate_jobs попеременно заполняет в строках и столбцах, используя последовательность 1D координат, предоставленные permute_sequence.

Если вы собираетесь в любом случае искать все 2D-пространство, это не поможет вам закончить раньше. Вы могли бы просто сканировать все точки в порядке. Но я думаю, что идея заключалась в том, чтобы найти достойное приближение минимум как можно раньше в поиске. Я подозреваю, что вы тоже можете это сделать, перетасовывая список случайным образом.

читатели XKCD отметим, что urinal protocol даст лишь немного разные (и, вероятно, лучше) результаты:

[0, 1000, 500, 250, 750, 125, 625, 375, ...] 
+0

Спасибо, Джейсон! Как выглядит путь в 2D пространстве? спираль уходит из центра диапазона? Как понять, что «задания» имеют список списков с различным количеством пар (c, g)? – Tim

+1

@Tim Списки - это линии; все точки в каждом списке имеют либо координату c, либо гамма-координату. Если вы начертите точки, в конце каждого списка вы увидите прямоугольную сетку точек, довольно равномерно распределенную по всему пространству поиска. Каждый список добавляет строку или столбец в эту сетку. –

1

Вот пример permute_sequence в действии:

print permute_sequence(range(8)) 
# prints [4, 2, 6, 1, 5, 3, 7, 0] 
print permute_sequence(range(12)) 
# prints [6, 3, 9, 1, 8, 5, 11, 0, 7, 4, 10, 2] 

Я не уверен, почему он использует этот порядок, потому что в main, оказывается, что все кандидаты пары (с, г) по-прежнему оценивается, я думаю.

+0

Я предполагаю, что это, возможно, намерены попробовать эти точки сетки, которые расположены близко к центру сетки, которая кажется более вероятно, будет лучшим и потребуется меньше времени для обучения? См. Мой предыдущий пост здесь http://agbs.kyb.tuebingen.mpg.de/km/bb/showthread.php?tid=1178. Но не совсем понимаю, что означает ответ. – Tim

Смежные вопросы