我正在将一些代码从Ruby重写为Python。该代码适用于Perceptron的8.2.6部分中列出的Clever Algorithms: Nature-Inspired Programming Recipes。我以前从未使用过Ruby而且我不理解这一部分:
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
?
答案 0 :(得分:4)
试试这个:
input_vector = [float(pattern[i]) for i in range(num_inputs)]
答案 1 :(得分:2)
pattern[k].to_f
将pattern[k]
转换为浮点数。
答案 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
总是比domain
中列表的长度少一个,那么您可能根本不需要该参数。
小心从一种语言到另一种语言的逐行翻译:无论涉及何种语言,都不会产生良好的结果。
编辑,因为您说您不认为需要转换为浮动,您只需从域值中切割所需数量的元素即可。我相应地更新了我的代码。