Я пишу функцию для реализации стохастической сети Хопфилда.Функция принимает в качестве входных данных случайный шаблон 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 будет отличаться от оригинального шаблона, который фактически есть, но оригинал должен остаться неизменным, тогда как это не так.