【问题标题】:what this python code trying to do这个python代码试图做什么
【发布时间】:2011-01-18 04:34:02
【问题描述】:

下面的python代码是以某种特殊的顺序遍历一个(c,g)的二维网格,存储在“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)的二维网格中搜索,找到值最小的网格点。我猜代码正在使用某种启发式搜索算法?原始代码在这里http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/gridsvr/gridregression.py,这是一个脚本,用于搜索支持向量机算法的两个参数 c 和 g 的最佳值,并具有最小的验证错误。

【问题讨论】:

    标签: python algorithm search machine-learning libsvm


    【解决方案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) 的所有候选对似乎仍在评估中。

    【讨论】:

    【解决方案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, ...]
    

    【讨论】:

    • 谢谢,杰森!路径在 2D 空间中看起来如何?远离范围中心的螺旋?如何理解“工作”有一个具有不同对数 (c, g) 的列表?
    • @Tim 列表是行;每个列表中的所有点共享 c 坐标或 gamma 坐标。如果您绘制点,在每个列表的末尾,您会看到一个矩形网格点,在整个搜索空间中相当均匀地分布。每个列表都会向该网格添加一行或一列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多