
Photo by
kazumaogiso
ホプフィールドネットワークとボルツマンマシンのPython実装。他はなし。
numpyを実装環境に入れて。
pip install numpy
ホプフィールドネットワークのPython実装
import numpy as np
class HopfieldNetwork:
def __init__(self, size):
self.size = size
self.weights = np.zeros((size, size))
def train(self, patterns):
for pattern in patterns:
pattern = pattern.reshape(self.size, 1)
self.weights += np.dot(pattern, pattern.T)
np.fill_diagonal(self.weights, 0)
def predict(self, pattern, steps=10):
for _ in range(steps):
for i in range(self.size):
net_input = np.dot(self.weights[i], pattern)
pattern[i] = 1 if net_input >= 0 else -1
return pattern
# テスト
patterns = np.array([[1, -1, 1, -1], [-1, 1, -1, 1]])
hopfield_net = HopfieldNetwork(size=4)
hopfield_net.train(patterns)
# 初期パターンを設定して予測
test_pattern = np.array([1, -1, -1, 1])
output = hopfield_net.predict(test_pattern)
("結果:", output)
train メソッドで、ホプフィールドネットワークに記憶するパターンを学習させる。重み行列を計算していく。
predict メソッドで、入力パターンを与え、記憶されたパターンに収束するまで更新を繰り返す。
ボルツマンマシンのPython実装
import numpy as np
class BoltzmannMachine:
def __init__(self, size, T=1.0):
self.size = size
self.weights = np.random.randn(size, size)
np.fill_diagonal(self.weights, 0)
self.T = T # 温度パラメータ
def sigmoid(self, x):
return 1 / (1 + np.exp(-x / self.T))
def update(self, state):
for i in range(self.size):
net_input = np.dot(self.weights[i], state)
prob = self.sigmoid(net_input)
state[i] = 1 if np.random.rand() < prob else -1
return state
def run(self, state, steps=100):
for _ in range(steps):
state = self.update(state)
return state
# テスト
state = np.array([1, -1, 1, -1])
boltzmann_net = BoltzmannMachine(size=4, T=2.0)
output = boltzmann_net.run(state)
print("結果:", output)
sigmoid 関数で、ボルツマン分布を使った確率計算を行い、ノードの状態を更新する。
温度 TTT によって、確率的な動きが強まったり弱まったりする。温度が高いとランダム性が増す。
ホプフィールドネットワークは、エネルギーが下がるように決まった形で動くけど、ボルツマンマシンは確率的に、ちょっとゆらぎながら動くって感じ