2012-01-26 12 views
3

私はRubyからPythonにいくつかのコードを書き直しています。コードはPerceptronで、セクション8.2.6に記載されています。Clever Algorithms: Nature-Inspired Programming Recipesです。私は前にルビーを使ったことがないと私はこの部分を理解していない:RubyをPythonに翻訳する

def test_weights(weights, domain, num_inputs) 
    correct = 0 
    domain.each do |pattern| 
    input_vector = Array.new(num_inputs) {|k| pattern[k].to_f} 
    output = get_output(weights, input_vector) 
    correct += 1 if output.round == pattern.last 
    end 
    return correct 
end 

いくつかの説明:num_inputsは(私の場合は2)の整数であり、domainは、アレイのリストです:[[1,0,1], [0,0,0], etc.]

私はこの行を理解していない:

input_vector = Array.new(num_inputs) {|k| pattern[k].to_f} 

をそれは2つの値は、すべての値|k|店舗pattern[k].to_f持つ配列を作成しますが、pattern[k].to_fは何ですか?

答えて

2
pattern[k].to_f 

pattern[k]をfloatに変換します。

4

これを試してみてください:

input_vector = [float(pattern[i]) for i in range(num_inputs)] 
+0

Pythonではfloat()は必要ありませんが、私は今理解できないルビーのものだと思います。 –

+0

@paolocappelletto、 'get_output'が何をするかによって異なります。 Python 2の整数除算は予期しない結果をもたらす可能性があります。 –

0

私はRubyの専門家ではないんだけど、私はそれがPythonでこのようなものになるだろうと思う:

def test_weights(weights, domain, num_inputs): 
    correct = 0 
    for pattern in domain: 
     output = get_output(weights, pattern[:num_inputs]) 
     if round(output) == pattern[-1]: 
      correct += 1 
    return correct 

スコープの多くは、これを最適化するためにあります: num_inputsが常に1より小さい場合、リストの長さはdomainになり、そのパラメータはまったく必要ないかもしれません。

ある言語から別の言語への行単位の翻訳には注意してください。どの言語に関係なく良い結果を得られない傾向があります。

編集:あなたはあなたがあなただけのドメイン値からの要素の必要数をスライスすることができfloatに変換する必要はないと思うと述べたことから。私はそれに応じて自分のコードを更新しました。

+0

ありがとうございます。私は行ごとの翻訳について完全にあなたに同意しています、私の問題は、私はコードの下で動作を見逃しているということです。 Array.newで(2)私は2つの値を持つ配列を作成します。すべての値はドメインリストの現在の値と同じです(私は浮動小数点に変換する必要はないと思います)...ああ、私はcoffeが必要です... –