2016-10-25 2 views
1

Я новичок в Python и пытаюсь интегрировать выборку из моей проблемной области в питоне и получаю следующее сообщение об ошибке:не может манипулировать списки

sum_square_error += (output[0:1] - expected) ** 2 
TypeError: unsupported operand type(s) for -: 'list' and 'list' 

Программа:

from __future__ import print_function 

import os 
import numpy as np 
import sys as sys 

from neat import nn, population, statistics 

# Network inputs and expected outputs. 
#xor_inputs = [[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]] 
#xor_outputs = [0.0, 1.0, 1.0, 0.0] 

xor_inputs = [[-14.7569, 17.9667, -55.0074, -0.218445, 0.835469, 11.23]] 

''', 
       [-23.8745,7.40331,-48.5434,0.114681,-0.0208769,15.2138], 
       [-22.2368,7.02313,-54.734,0.0633238,-0.097209,12.7707], 
       [-19.0957,7.03371,-48.6117,0.108994,-0.0357287,15.205]] 
''' 

xor_outputs = [[-31.1812, 47.2076, -34.9315, 62.6799]] 
''', 
       [-53.9514,97.2412,55.7927,92.506], 
       [-27.417,47.7492,-28.1557,78.6016], 
       [-57.4506,99.2558,55.7436,92.3611]] 
''' 


def eval_fitness(genomes): 
    for g in genomes: 
     net = nn.create_feed_forward_phenotype(g) 

     sum_square_error = 0.0 
     for inputs, expected in zip(xor_inputs, xor_outputs): 
      # Serial activation propagates the inputs through the entire network. 
      output = net.serial_activate(inputs) 
#   print(xor_inputs[0:1]) 
#   print(xor_outputs[0:1]) 
#   sys.exit(0) 
      sum_square_error += (output[0] - expected) ** 2 

     # When the output matches expected for all inputs, fitness will reach 
     # its maximum value of 1.0. 
     g.fitness = 1 - sum_square_error 


local_dir = os.path.dirname(__file__) 
config_path = os.path.join(local_dir, 'xor2_config') 
pop = population.Population(config_path) 
pop.run(eval_fitness, 300) 

# Log statistics. 
statistics.save_stats(pop.statistics) 
statistics.save_species_count(pop.statistics) 
statistics.save_species_fitness(pop.statistics) 

print('Number of evaluations: {0}'.format(pop.total_evaluations)) 

# Show output of the most fit genome against training data. 
winner = pop.statistics.best_genome() 
print('\nBest genome:\n{!s}'.format(winner)) 
print('\nOutput:') 
winner_net = nn.create_feed_forward_phenotype(winner) 
for inputs, expected in zip(xor_inputs, xor_outputs): 
    output = winner_net.serial_activate(inputs) 
    print("expected {0:1.5f} got {1:1.5f}".format(expected, output[0])) 

Я искала и обнаружил, что он должен быть преобразован в массив numpy. Когда я конвертировать xor_inputs и xor_outputs в Numpy массивов, то он говорит:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Следует отметить, что первоначальная проблема исключающего имеет 2 входа в 2d массива и 1 выход в выходном массиве 1d. В моей проблеме у меня есть 6 входов в 2d-массиве и 4 выхода в 2d-массиве.

+0

На каком коде была сделана эта ошибка 'ValueError: значение истинности массива с более чем одним элементом неоднозначно ...' произойдет? – Akihiko

+0

Замена 'output [0: 1]' by 'output [0]' исправит первую указанную вами ошибку. Последний элемент, который вы хотите, первый - это список из 1 элемента, который содержит этот элемент. –

ответ

1

Хотя я внимательно не читал вашу программу, способ реализации суммы квадрата ошибки со списком является:

>>> va=[1.0, 2.0, 3.0, 4.0] 
>>> vb=[0.0, 1.0, 2.0, 3.0] 
>>> sum((a-b)**2 for a,b in zip(va,vb)) 
4.0 

Чтобы понять это, попробуйте:

>>> [(a-b)**2 for a,b in zip(va,vb)] 
[1.0, 1.0, 1.0, 1.0] 

Вы можете сделать это с NumPy более легко:

>>> import numpy as np 
>>> va=np.array([1.0, 2.0, 3.0, 4.0]) 
>>> vb=np.array([0.0, 1.0, 2.0, 3.0]) 
>>> sum((va-vb)*(va-vb)) 
4.0 

ИЛИ

>>> import numpy.linalg as la 
>>> la.norm(va-vb)**2 
4.0 

(va-vb)*(va-vb) дает внутренний продукт (va-vb) и (va-vb), поэтому его сумма дает квадратичную норму (va-vb). la.norm дает норму заданного вектора.

Я думаю, что выше будет полезно (и решение) к вашей проблеме.

Что касается вопроса:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Это происходит, когда вы ждете, чтобы получить логическое значение из булева списка. Давайте посмотрим пример:

>>> va=np.array([1.0, 2.0, 3.0, 4.0]) 
>>> vb=np.array([1.0, 1.0, 2.0, 3.0]) 
>>> va==vb 
array([ True, False, False, False], dtype=bool) 

>>> 1 if va==vb else 0 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

Теперь стало ясно, что Python не понимает, если мы ожидаем, что и в (ва == VB) или OR из него. (va==vb).any() дает OR (true, если хотя бы один из элементов является истинным), а (va==vb).all() дает AND (true, если все элементы верны).

>>> (va==vb).any() 
True 
>>> (va==vb).all() 
False 
>>> 1 if (va==vb).all() else 0 
0 
Смежные вопросы