import numpy as np
from matplotlib import pyplot as plt
# genutze ressourcen
## https://iq.opengenus.org/hopfield-network/
patterns = np.array([[1, -1, 1, 1, 1, 1, 1, -1],[1, 1, -1, 1, -1, 1, -1, -1]])
S = np.array([1, -1, 1, -1, 1, -1, 1, -1])
skal = np.sum(patterns[0] * patterns[1])
n_elems = len(patterns[0])
n_patterns = len(patterns)
max_iterations = 20
o = 1
if skal == 0:
print("Diese Vektoren sind orthogonal")
else:
print("Diese Vektoren sind nicht orthogonal.")
def calc_weights(pat):
W = np.zeros((n_elems,n_elems))
for i in range(len(pat[0])):
for j in range(len(pat[0])):
if i == j or W[i,j] != 0.0:
continue
w = 0.0
for n in range(n_patterns):
w += patterns[n, i] * patterns[n, j]
W[i, j] = w / patterns.shape[0]
W[j, i] = W[i, j]
return W
W = calc_weights(patterns)
print(W)
def energy(W, S, o):
e = -0.5*np.matmul(np.matmul(W,S),(S*o)) # really not sure about the last multiplication here...
return e
print(energy(W,S,o))
max_patterns = n_elems * 0.146
if max_patterns < n_patterns:
print("Kritischer Punkt erreicht. Die Qualität könnte daran leiden.")
else:
print("Anzahl liegt unter kritischem Punkt")
max_patterns = 36 * 0.146
# kleiner Check -> sieht gut aus!
if max_patterns < 4:
print("Kritischer Punkt erreicht. Die Qualität könnte daran leiden.")
else:
print("Anzahl liegt unter kritischem Punkt")