Python вложено для циклов - внутреннее изменение типа итератора l oop - PullRequest
0 голосов
/ 18 февраля 2020

В этой функции exs предполагается как список списков с плавающей точкой. Он представляет список всех моих обучающих примеров, каждый из которых представляет собой список (длина num_vars) с плавающей точкой, представляющий ввод перцептрона. target предполагается как список (длина num_vars) чисел с плавающей точкой, представляющий коэффициенты целевой функции.

def gradDesc(exs, target, num_vars, n=0.5, its=256):
    import random
    weights = []
    # Create and initialize delWeights to 0. Make its size num_vars.
    delWeights = [0.0]*num_vars


    # Initializes the weights to a real number in [-1,1]. Also makes weights
    # contain num_vars entries.
    for i in range(num_vars):
        weights.append(random.uniform(-1,1))

    # To make the printouts look nicer
    print("Iteration\tError")
    print("---------\t-----")

    for i in range(its):

        # Reset delWeights to 0
        for j in range(num_vars):
            delWeights[j] = 0

        for e in exs:

            # Plug e into the current hypothesis and get the output.
            output = test_hypo(weights, e, num_vars)

            print("delWeights: ", delWeights)
            for dw in delWeights:
                print("type(dw): ", type(dw))
                delWeights[dw] = delWeights[dw] + n*(test_hypo(target, e, num_vars) - output)*e[dw]

        for w in weights:
            weights[w] = weights[w] + delWeights[dw]

        # Print out the error every tenth iteration
        if i % 10 == 0:
            print(i + "\t" + train_err(exs, target, weights, num_vars))

    # Print out the final hypothesis
    print(i + "\t" + train_err(exs, target, weights, num_vars))

    return weights

Проблема заключается в том, что когда я пытаюсь запустить это с заданным (конечным) тестовым вводом

trainers = 
[[1, 2.7902232015508766, -4.624194135789617], 
[1, -7.964359679418456, 2.1940274082288624], 
[1, 8.445941538761794, -8.86567924774781], 
... other sub-lists following this same format ...]

и

target = [-2, 1, 2]

Я получаю этот странный вывод:

gradDesc(trainers, target, num_vars)
Iteration       Error
---------       -----
delWeights:  [0, 0, 0]
type(dw):  <class 'int'>
type(dw):  <class 'int'>
type(dw):  <class 'int'>
delWeights:  [0.0, 0, 0]
type(dw):  <class 'float'>
Traceback (most recent call last):

  File "<ipython-input-19-97298b385113>", line 1, in <module>
    gradDesc(trainers, target, num_vars)

  File "C:/Users/Me/.spyder-py3/Machine Learning/gradDesc.py", line 107, in gradDesc
    delWeights[dw] = delWeights[dw] + n*(test_hypo(target, e, num_vars) - output)*e[dw]

TypeError: list indices must be integers or slices, not float

Итак, мой вопрос: почему тип dw меняется с int в число с плавающей точкой на второй итерации через for e in exs l oop?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2020
delWeights[dw] = delWeights[dw] + n*(test_hypo(target, e, num_vars) - output)*e[dw]

устанавливает delWeights[dw] в число с плавающей точкой, потому что e[dw] - это число с плавающей точкой. Поэтому в следующий раз, когда вы сделаете for dw in delWeights: l oop, dw - это число с плавающей точкой.

Не имеет смысла использовать элементы delWeights в качестве индексов. Если вы хотите перебрать список, а также получить индексы, вы должны использовать enumerate()

for i, dw in enumerate(delWeights):
    delWeights[i] = dw + n*(test_hypo(target, e, num_vars) - output)*e[i]
0 голосов
/ 18 февраля 2020

Вы имели в виду l oop через индексы delWeight, используя for i in range(len(delWeights)) вместо for dw in delWeights?

for dw in delWeights, перебирая все значения в delWeights, поэтому первый итерация вашей l oop, вероятно, присваивает число с плавающей точкой одному из delWeights индексов в delWeights[dw] + n*(test_hypo(target, e, num_vars) - output)*e[dw].

...