見出し画像

ホプフィールドネットワークとボルツマンマシンの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)
  1. train メソッドで、ホプフィールドネットワークに記憶するパターンを学習させる。重み行列を計算していく。

  2. 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)
  1. sigmoid 関数で、ボルツマン分布を使った確率計算を行い、ノードの状態を更新する。

  2. 温度 TTT によって、確率的な動きが強まったり弱まったりする。温度が高いとランダム性が増す。

ホプフィールドネットワークは、エネルギーが下がるように決まった形で動くけど、ボルツマンマシンは確率的に、ちょっとゆらぎながら動くって感じ


いいなと思ったら応援しよう!