1

次の python コードは、"jobs" と "job_queue" に格納されている (c, g) の 2D グリッドを特別な順序でトラバースします。しかし、コードを理解しようとしても、どのような順序なのかわかりません。誰かが順序について教えて、各機能の目的について説明をすることができますか? よろしくお願いします!

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 アルゴリズムを検索するスクリプトで、2 つのパラメーター c と g の最適な値を最小値で検証エラー。

4

2 に答える 2

2

permute_sequence値のリストを並べ替えて、中央の値が最初になり、次に各半分の中点、次に残りの 4 つの四半期の中点というようになります。したがってpermute_sequence(range(1000))、次のように開始します。

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

calculate_jobsによって提供される一連の 1D 座標を使用して、行と列を交互に埋めますpermute_sequence

とにかく最終的に 2D 空間全体を検索する場合、これはすぐに終了するのに役立ちません。すべてのポイントを順番にスキャンすることもできます。しかし、検索のできるだけ早い段階で、適切な最小値の近似値を見つけるという考えがあったと思います。リストをランダムにシャッフルすることで、同様のことができると思います。

xkcd の読者は、便器のプロトコルがわずかに異なる (そしておそらくより良い) 結果をもたらすことに気付くでしょう:

    [0, 1000, 500, 250, 750, 125, 625, 375, ...]
于 2010-02-18T16:31:33.080 に答える
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]

では、(c,g) のすべての候補ペアがまだ評価されているように見えるため、なぜこの順序を使用するのかわかりません。main

于 2010-02-18T16:24:00.793 に答える