2012-01-26 2 views
3

루비에서 파이썬으로 일부 코드를 다시 작성하고 있습니다. 코드는 Perceptron이고, 섹션 8.2.6에 나열된 Clever Algorithms: Nature-Inspired Programming Recipes입니다. 내가 전에 루비를 사용한 적이 나는이 부분을 이해하지 않습니다루비를 파이썬으로 번역

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.]

모든 값을, |k| 저장 pattern[k].to_f

input_vector = Array.new(num_inputs) {|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

파이썬에서는 float()이 필요하지 않습니다. 지금은 이해할 수없는 루비 일 것입니다. –

+0

@paolocappelletto, get_output이 무엇을하는지에 따라 다릅니다. 파이썬 2의 정수 부분은 예기치 않은 결과를 줄 수 있습니다. –

0

을 나는 루비 전문가는 아니지만 그것은 파이썬에서 이런 일이 될 것이라고 생각 :

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)와 함께 두 값으로 배열을 만듭니다. 모든 값은 도메인 목록의 현재 값과 같습니다. (float로 변환해야한다고 생각하지 않습니다.) ... 오, 세상에 내가 필요로하는 ... –