Home > Contenuti utili > PLS 2026, Dinamica Hopfield
PLS 2026, Dinamica Hopfield
import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
# -----------------------------
# Parametri
# -----------------------------
N = 20 # numero di neuroni
n = 20 # passi temporali
# -----------------------------
# Matrice w a segni alterni (scacchiera)
# -----------------------------
upper = np.zeros((N, N), dtype=int)
for i in range(N):
for j in range(N):
upper[i, j] = (-1) ** (i + j)
upper = np.triu(upper, k=1)
W = upper + upper.T
# -----------------------------
# Matrice w a segni alterni ogni due passi
# -----------------------------
W = np.fromfunction(
lambda i, j: (-1) ** ((i + j + 1) // 2),
(N, N),
dtype=int
)
np.fill_diagonal(W, 0)
# -----------------------------
# (alternative — commentate)
# -----------------------------
# pesi casuali ±1
# upper = np.random.choice([-1, 1], size=(N, N))
# upper = np.triu(upper, k=1)
# W = upper + upper.T
# pesi gaussiani
# W = np.random.normal(0, 1, size=(N, N))
# np.fill_diagonal(W, 0)
# -----------------------------
# Stampa matrice W
# -----------------------------
print("W =")
print(sp.Matrix(W))
# -----------------------------
# Stato iniziale casuale
# -----------------------------
sigma = np.random.choice([-1, 1], size=N)
print("\nsigma(0) =")
print(sp.Matrix(sigma))
# -----------------------------
# Energia di Hopfield
# -----------------------------
def energy(s, W):
return -0.5 * np.dot(s, np.dot(W, s))
# -----------------------------
# Dinamica di Hopfield
# -----------------------------
energies = []
for t in range(n):
# scegli neurone casuale
i = np.random.randint(N)
# campo efficace
h_i = np.dot(W[i], sigma)
# aggiornamento asincrono
if h_i >= 0:
sigma[i] = 1
else:
sigma[i] = -1
# salva energia
energies.append(energy(sigma, W))
print("\nsigma(n) =")
print(sp.Matrix(sigma))
# -----------------------------
# Plot energia
# -----------------------------
plt.figure()
plt.plot(energies, marker="o")
plt.xlabel("tempo")
plt.ylabel("Energia")
plt.title("Dinamica di Hopfield")
plt.grid(True)
plt.tight_layout()
plt.show()