Почему моя постоянная переменная изменяется внутри моей функции? - PullRequest
0 голосов
/ 21 сентября 2019

Я пишу функцию для реализации стохастической сети Хопфилда.Функция принимает в качестве входных данных случайный шаблон p, матрицу весов и бета-значение вместе с исходным шаблоном (на первой итерации случайный шаблон и исходный шаблон будут одинаковыми). Функция вызывается рекурсивно, поэтому выходнойкаждой итерации является входом следующей итерации, однако исходный шаблон должен оставаться неизменным на протяжении всех итераций.Но мой оригинальный шаблон меняется вместе с моим шаблоном p (i), который я не понимаю, почему.

Одна странная вещь в том, что это тот случай, когда исходный случайный шаблон и исходный шаблон даже различаются во многихиндексы.Если бы они полностью (по всем показателям) были разными, то это было бы не так.Однако здесь также появляются некоторые исключения, которые я объясню в коде.Ниже приведена функция, которая выполняет один шаг обновления для сети.

def stochastic_feed(input_pattern, weights, beta, original_pattern):

    bits = len(input_pattern)
    bias = 0
    new_stoch_pattern = input_pattern

    random_neuron = int(np.random.choice(range(bits), replace=True))
    for i4 in range(bits):
        bias += weights[random_neuron][i4] * input_pattern[i4]
    probability = 1 / (1 + np.exp(-2 * beta * bias))

Это строка, в которой возникает проблема, и исходный шаблон изменяется так же, как new_stoch_pattern, чего я не понимаю, почему.

    np.put(new_stoch_pattern, random_neuron, np.random.choice([1, -1], p=[probability, 1-probability]))

И печатается Trueиз консоли

    print(np.array_equal(new_stoch_pattern, original_pattern))

    return new_stoch_pattern

наконец, вот как я рекурсивно выполняю функцию.Шаблон для подачи в функцию имеет форму (1, N).Матрица весов имеет форму (N, N), которую вы можете установить для случайных равномерных чисел ради этого вопроса.

new_pattern = original_pattern
iter = 1
while iter1 < 10000:
    new_pattern = 
    stochastic_feed(new_pattern, weights, 0, original_pattern)
    all_first_sums.append(first_sum)
    iter1 += 1

Здесь происходит то, что, например, если я сделаю это:

new_pattern = -original_pattern 

, тогда консоль отобразит false.Но если напишите:

new_pattern[:] = -original_pattern[:]

, тогда оригинальный шаблон снова изменится вместе с new_pattern.То же самое относится, например, к

new_pattern[:50] = -original_pattern[:50] 

.

Я ожидаю, что new_pattern будет отличаться от оригинального шаблона, который фактически есть, но оригинал должен остаться неизменным, тогда как это не так.

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