| 1 | data Class = A | B deriving (Eq, Show) |
|---|
| 2 | type Coord = (Double, Double) |
|---|
| 3 | type Neuron = (Double, Double, Double) |
|---|
| 4 | type Merk = (Coord, Class) |
|---|
| 5 | |
|---|
| 6 | merk1 :: [Merk] |
|---|
| 7 | merk1 = [ |
|---|
| 8 | ((0.1, 0.4), A), |
|---|
| 9 | ((0.6, 0.1), A), |
|---|
| 10 | ((0.2, 1.0), B), |
|---|
| 11 | ((0.8, 0.9), B) |
|---|
| 12 | ] |
|---|
| 13 | |
|---|
| 14 | merk2 :: [Merk] |
|---|
| 15 | merk2 = [ |
|---|
| 16 | ((0.1, 1.0), B), |
|---|
| 17 | ((0.1, 0.1), A), |
|---|
| 18 | ((0.3, 0.3), B), |
|---|
| 19 | ((0.5, 0.9), A) |
|---|
| 20 | ] |
|---|
| 21 | |
|---|
| 22 | addN :: Neuron -> Neuron -> Neuron |
|---|
| 23 | (w1,w2,b) `addN` (w1',w2',b') = (w1 + w1', w2 + w2', b + b') |
|---|
| 24 | |
|---|
| 25 | guess :: Neuron -> Coord -> Class |
|---|
| 26 | guess (w1, w2, b) (x1,x2) = if w1*x1 + w2*x2 > b then B else A |
|---|
| 27 | |
|---|
| 28 | errors :: Neuron -> [Merk] -> [Merk] |
|---|
| 29 | errors n = filter (\(co, cl) -> guess n co /= cl) |
|---|
| 30 | |
|---|
| 31 | iteration :: [Merk] -> Neuron -> Neuron |
|---|
| 32 | iteration merks n@(w1,w2,b) = foldr addN n $ map delta $ errors n merks |
|---|
| 33 | where delta ((x1,x2), c) = (dir c * x1, dir c * x2, dir c * 1) |
|---|
| 34 | dir A = 1 |
|---|
| 35 | dir B = -1 |
|---|
| 36 | |
|---|
| 37 | startn :: Neuron |
|---|
| 38 | startn = (-1, 1, 0) |
|---|
| 39 | |
|---|
| 40 | pretty :: Neuron -> [Merk] -> IO () |
|---|
| 41 | pretty n merks = do |
|---|
| 42 | putStrLn $ concat $ map printLine (zip steps [0..]) |
|---|
| 43 | putStrLn $ "Ergebnis "++(show res) |
|---|
| 44 | where (steps,res:_) = span (\n -> not (null (errors n merks))) $ iterate (iteration merks) n |
|---|
| 45 | printLine (step,i) = "Schritt "++ (show i) ++ ": " ++ (show step) ++ |
|---|
| 46 | " (Falsch: "++ show ((errors step merks)) ++ ")" |
|---|