以下python代码以某种特殊顺序遍历(c,g)的2D网格,该网格存储在“jobs”和“job_queue”中。但是我不确定在尝试理解代码之后它是哪种顺序。有人能够告诉订单并为每个功能的目的提供一些解释吗?谢谢和问候!
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()
编辑:
每个(c,g)都有一个值。代码实际上是在(c,g)的2D网格中搜索以找到值最小的网格点。我猜代码是使用某种启发式搜索算法?原始代码在这里http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/gridsvr/gridregression.py,这是一个搜索svm算法的脚本,两个参数c和g的最佳值具有最小验证错误。
答案 0 :(得分:2)
permute_sequence
重新排序值列表,以便中间值为第一个,然后是每个半部分的中点,然后是剩余四个季度的中点,依此类推。所以permute_sequence(range(1000))
就像这样开始:
[500, 250, 750, 125, 625, 375, ...]
calculate_jobs
使用permute_sequence
提供的一维坐标序列交替填充行和列。
如果您最终要搜索整个2D空间,这无助于您尽快完成。您也可以按顺序扫描所有点。但我认为这个想法是在搜索中尽早找到最小的近似。我怀疑你可以通过随机洗牌来做到这一点。
xkcd读者会注意到urinal protocol只能给出稍微不同(可能更好)的结果:
[0, 1000, 500, 250, 750, 125, 625, 375, ...]
答案 1 :(得分: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
中,似乎所有(c,g)的候选对仍然被评估,我认为。