Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

ヘブの法則

上でレビューした「進化しすぎた脳」の巻末に、ヘブの法則というものを使うと数学で簡単に記憶のモデルが作れる、という付録がありました。ちなみに、ちょっとググったところ、本の内容がここ↓に
行列をつかった記憶のシミュレーション
そのまんま載ってました。

で、このヘブの法則をPythonで書いてみました。

from numarray import *

class hebb:
    memory = []
    memory_size = 0
    
    def __init__(self, size):
        self.memory_size = size
        self.memory = reshape([0]*size**2, (size, size))
        
    def learn(self, neural_activity):
        if self.memory_size != len(neural_activity):
            return False

        for y in range(self.memory_size):
            for x in range(self.memory_size):
                if x == y:
                    self.memory[x,y] = 0
                elif neural_activity[x] == 1 and neural_activity[y] == 1:
                    self.memory[x,y] += 1
                elif neural_activity[x] == -1 and neural_activity[y] == -1:
                    pass
                else:
                    self.memory[x,y] -= 1
        return True

    def remember(self, neural_activity):
        if self.memory_size != len(neural_activity):
            return False

        neural_activity = reshape(neural_activity, (self.memory_size, 1))
        mind = dot(self.memory ,neural_activity)
        return reshape(mind / abs(mind), (1, self.memory_size))[0]

で、こんな感じのコード↓を実行すると、

def learn(na):
    if h.learn(na):
        print na, "を覚えました。"
    else:
        print na, "は覚えられません。"

def remember(question):
    answer = h.remember(question)
    if any(answer):
        print "%sから、%sを思い出しました!" % (question, answer)
    else:
        print question, "を思い出せません。"

h = hebb(3) 
learn([1,1,-1])
learn([1,1,-1])
learn([1,1,-1])
remember([1,1,-1])
remember([1,1,0])
learn([1,-1,1])
learn([1,-1,1])
remember([1,1,-1])
remember([1,-1,1])

こんな結果↓がでます。

[1, 1, -1]を覚えました。
[1, 1, -1]を覚えました。
[1, 1, -1]を覚えました。
[ 1,  1, -1]から、[ 1   1  -1]を思い出しました! # 正解
[ 1,  1,  0]から、[ 1   1  -1]を思い出しました! # 推測して正解
[1, -1, 1]を覚えました。
[1, -1, 1]を覚えました。
[ 1,  1, -1]から、[ 1   1  -1]を思い出しました! # 最初に教えたのを覚えてる
[ 1, -1,  1]から、[-1  -1   1]を思い出しました! # 2回しか教えてないのは間違えた

本に書かれている例の通り、3回教えた方は、思い出せて推測も出来てますが、2回しか教えてない方は、きちんと(?)間違えました。ちょっと笑える。