Yabu.log

ITなどの雑記

Pythonでパーセプトロンのクラスを実装した

github.com

  • インスタンスを作る時にバイアス,重みを与える
  • 実行時にx1,x2を与える

を実現するために作った。 多分読み進めたらちゃんとしたパーセプトロンのクラスは作られるような気もするが、 Python書く練習として作ってみました。

  • 例外処理
  • 可視性・可変性
  • その他ドキュメント

などは考えて作っていませんが、余裕ができれば追加しようと思います。

テストとしては本中のパーセプトロンの例,AND OR NANDの例を入れてみました。 なお多層パーセプトロンとしてxorを作ってみました。*1

多層パーセプトロンはクラス化できるのか、あまり想像できません

import unittest
import Perceptron as fortest
class TestPerceptron(unittest.TestCase):
    def test_init(self):
        perceptron = fortest.Perceptron(0.5,0.5,-0.7)
        self.assertEqual(perceptron.w1,0.5)
        self.assertEqual(perceptron.w2,0.5)
        self.assertEqual(perceptron.b,-0.7)

    def test_and(self):
        AND = fortest.Perceptron(0.5,0.5,-0.7)
        self.assertEqual(1,AND.do(1,1))
        self.assertEqual(0,AND.do(0,1))
        self.assertEqual(0,AND.do(1,0))
        self.assertEqual(0,AND.do(0,0))

    def test_nand(self):
        NAND = fortest.Perceptron(w1=-0.5,w2=-0.5,b=0.7)
        self.assertEqual(1,NAND.do(0,1))
        self.assertEqual(1,NAND.do(1,0))
        self.assertEqual(1,NAND.do(0,0))
        self.assertEqual(0,NAND.do(1,1))

    def test_or(self):
        OR = fortest.Perceptron(w1=0.5,w2=0.5,b = -0.2)
        self.assertEqual(1,OR.do(0,1))
        self.assertEqual(1,OR.do(1,0))
        self.assertEqual(0,OR.do(0,0))
        self.assertEqual(1,OR.do(1,1))

    def test_xor(self):
        NAND = fortest.Perceptron(w1=-0.5,w2=-0.5,b=0.7)
        OR   = fortest.Perceptron(w1=0.5,w2=0.5,b = -0.2)
        AND  = fortest.Perceptron(0.5,0.5,-0.7)
        #Perceptron can not solve the nonlinear problem, but it is possible with multilayer perceptron.
        #Since the XOR gate is a nonlinear problem, it is implemented with a multilayer perceptron.
        def XOR(x1,x2):
            return AND.do(NAND.do(x1,x2),OR.do(x1,x2))
        self.assertEqual(0,XOR(0,0))
        self.assertEqual(1,XOR(1,0))
        self.assertEqual(1,XOR(0,1))
        self.assertEqual(0,XOR(1,1))

if __name__ == '__main__':
    unittest.main()

*1:実装自体はテストの外にするようなもんだと思うけど。。。