Ticket #1390: blatt2a6.2.hs

File blatt2a6.2.hs, 1.2 KB (added by mail@…, 7 years ago)

Very similar code that does not cause the problem.

Line 
1data Class = A | B deriving (Eq, Show)
2type Coord = (Double, Double)
3type Neuron = (Double, Double, Double)
4type Merk   = (Coord, Class)
5
6merk1 :: [Merk]
7merk1 = [
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
14merk2 :: [Merk]
15merk2 = [
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
22addN :: Neuron -> Neuron -> Neuron
23(w1,w2,b) `addN` (w1',w2',b') = (w1 + w1', w2 + w2', b + b')
24
25guess :: Neuron -> Coord -> Class
26guess (w1, w2, b) (x1,x2) =  if w1*x1 + w2*x2 > b then A else B
27
28errors :: Neuron -> [Merk] -> [Merk]
29errors n = filter (\(co, cl) -> guess n co /= cl)
30
31iteration :: [Merk] -> Neuron -> Neuron
32iteration 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
37startn :: Neuron
38startn = (-1, 1, 0)
39
40pretty :: Neuron -> [Merk] -> IO ()
41pretty 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)) ++ ")"