Skip to content

Commit

Permalink
Lisp version fully complete now.
Browse files Browse the repository at this point in the history
  • Loading branch information
arthurschreiber committed Apr 14, 2011
1 parent 9e67e05 commit 07779df
Show file tree
Hide file tree
Showing 4 changed files with 334 additions and 39 deletions.
164 changes: 164 additions & 0 deletions lisp/example.lisp
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,164 @@
(defun prune (x)
(cond ((null x) nil)
((null (car x)) (prune (cdr x)))
(T (cons (car x) (prune (cdr x))))))

(defun read-exampleset (file)
(LET ((STREAM (OPEN file :DIRECTION :INPUT)))
(DO ((expression NIL (READ STREAM NIL STREAM))
(xprlist nil (cons expression xprlist)))
((EQ expression STREAM) (progn (CLOSE STREAM) (reverse (prune xprlist)))))))

; --- example:

; Generate a file in which you may write the lecture example:
;
; ("saengerin" "jazz" "20er-50er")
; ("saenger" "jazz" "20er-50er")
;
; (read-exampleset "yourfilename") should then return the list
;
; (("saengerin" "jazz" "20er-50er")("saenger" "jazz" "20er-50er"))
;

(load "version_space.lisp")

(defun negative-examples (examples key)
(remove-if #'(lambda (example)
(equal (first (last example)) key)
) examples)
)

(defun positive-examples (examples key)
(remove-if-not #'(lambda (example)
(equal (first (last example)) key)
) examples)
)

(defun gen-star (example examples)
(first
(reduce #'(lambda (vs neg_example)
(negative-example vs (butlast neg_example))
) (negative-examples examples (last example)) :initial-value (positive-example (gen-version-space (- (length example) 1)) (butlast example)))
)
)

(defun select-best-generalization (star positives negatives)
;; "Beste" Generalisierung - Erste Generalisierung
; (first star)

;; "Beste" Generalisierung - Letzte Generalisierung
(first (last star))

;; "Beste" Generalisierung - Viele "*"
; (first (sort star #'> :key #'(lambda (g)
; (reduce (lambda (acc item)
; (if (equal item "*") (+ acc 1) acc)
; ) g :initial-value 0)
; )))

;; "Beste" Generalisierung - Wenig "*"
; (first (sort star #'> :key #'(lambda (g)
; (reduce (lambda (acc item)
; (if (equal item "*") (+ acc 1) acc)
; ) g :initial-value 0)
; )))

;; "Beste" Generalisierung - Möglichst viele Positive Beispiele abgedeckt
; (first (sort star #'> :key #'(lambda (g)
; (reduce (lambda (acc item)
; (if (more-general? g item) (+ acc 1) acc)
; ) positives :initial-value 0)
; )))
)

(defun gen-best-generalization (pos_example negatives positives)
(select-best-generalization
(gen-star pos_example negatives)
positives
negatives
)
)

(defun gen-concept-space-helper (positives negatives k)
(if
(equal 0 (length positives)) k
(let ((g (gen-best-generalization (first positives) negatives positives)))
(gen-concept-space-helper
(remove-if #'(lambda (pos_example)
(more-general? g pos_example)
) positives)
negatives (cons g k))
)
)
)

(defun gen-concept-space (positives negatives)
(gen-concept-space-helper positives negatives '())
)

(defun matches-for (example K)
(reduce #'(lambda (result concept_space)
(append result (reduce #'(lambda (matches generalization)
(if (more-general? generalization (butlast example))
(append matches (list (first concept_space)))
matches
)
) (second concept_space) :initial-value '()) )
) K :initial-value '())
)

(let
( (examples (read-exampleset "input.txt"))
(test_examples (read-exampleset "test.txt"))
(keys '("Buch_A" "Buch_B" "Buch_C"))
)

(let (
(K (mapcar #'(lambda (key)
(list key
(gen-concept-space
(positive-examples examples key)
(negative-examples examples key)
)
)
) keys)))

(let (
(matches (mapcar #'(lambda (example)
(list example (matches-for example K))
) test_examples)))

(loop for match in matches do
(format t "---------------------------------------~%")
(format t "Datensatz: ~A~%" (butlast (first match)))
(if (second match)
(format t "Mögliche Buchwahl: ~A~%" (remove-duplicates (second match)))
(format t "Leider keine Aussage möglich!~%")
)
(format t "Die korrekte Buchwahl: ~A" (last (first match)))
(format t "~%")
(format t "~%")
)

(format t "---------------------------------------~%")

(format t "Anzahl an korrekten Vorhersagen ~A~%" (count-if #'(lambda (match)
(and
(equal (list-length (second match)) 1)
(find-if #'(lambda (x) (equal x (first (second match)))) (second match))
)
) matches))

(format t "Anzahl an nicht eindeutigen Vorhersagen ~A~%" (count-if #'(lambda (match)
(and
(> (list-length (second match)) 1)
)
) matches))

(format t "Anzahl an falschen Vorhersagen ~A~%" (count-if #'(lambda (match)
(not (find-if #'(lambda (x) (equal x (first (second match)))) (second match)))
) matches))
)
)
)
70 changes: 70 additions & 0 deletions lisp/input.txt
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,70 @@
("19-24" "m" "nein" "0" "keiner" "Angestellter" "3000-3999" "Buch_C")
("25-35" "m" "nein" "1" "Realschule" "Arbeitslos" "1000-1999" "Buch_C")
("36-49" "m" "nein" "0" "Hochschule" "Angestellter" "3000-3999" "Buch_C")
("25-35" "m" "ja" "1" "Hochschule" "Fuehrungskraft" "5000 und mehr" "Buch_C")
("36-49" "w" "nein" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_C")
("<18" "w" "nein" "0" "keiner" "Hausfrau" "2000-2999" "Buch_A")
("19-24" "w" "ja" "1" "Hauptschule" "Arbeitslos" "1000-1999" "Buch_B")
("25-35" "w" "ja" "1" "Hochschule" "Arbeitslos" "<1000" "Buch_C")
("<18" "w" "nein" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("19-24" "w" "nein" "0" "keiner" "Selbstaendig" "1000-1999" "Buch_A")
("50-65" "m" "nein" "0" "Promotion" "Fuehrungskraft" "5000 und mehr" "Buch_C")
("<18" "m" "nein" "0" "Realschule" "Angestellter" "3000-3999" "Buch_C")
("<18" "w" "ja" "1" "keiner" "Arbeitslos" "<1000" "Buch_A")
("36-49" "m" "nein" "0" "Hochschule" "Angestellter" "2000-2999" "Buch_C")
("36-49" "w" "ja" "2" "Hochschule" "Arbeiter" "1000-1999" "Buch_C")
("36-49" "w" "ja" "0" "Realschule" "Angestellter" "1000-1999" "Buch_C")
("36-49" "w" "nein" "0" "Hochschule" "Hausfrau" "3000-3999" "Buch_C")
("25-35" "m" "nein" "1" "Hochschule" "Angestellter" "3000-3999" "Buch_C")
("50-65" "m" "nein" "0" "keiner" "Rentner" "1000-1999" "Buch_A")
("50-65" "w" "nein" "1" "Hochschule" "Angestellter" "2000-2999" "Buch_C")
("25-35" "m" "nein" "1" "Gymnasium" "Selbstaendig" "5000 und mehr" "Buch_C")
("19-24" "m" "ja" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_C")
("25-35" "w" "ja" "4" "Hochschule" "Hausfrau" "2000-2999" "Buch_C")
("36-49" "w" "ja" "1" "keiner" "Angestellter" "2000-2999" "Buch_A")
("50-65" "m" "ja" "2" "Hauptschule" "Angestellter" "2000-2999" "Buch_C")
("19-24" "m" "nein" "0" "Gymnasium" "Angestellter" "3000-3999" "Buch_C")
("36-49" "m" "ja" "0" "Hochschule" "Angestellter" "2000-2999" "Buch_C")
("36-49" "w" "ja" "2" "keiner" "Arbeiter" "1000-1999" "Buch_A")
("25-35" "m" "nein" "0" "Hochschule" "Arbeitslos" "<1000" "Buch_C")
("50-65" "w" "nein" "0" "Promotion" "Hausfrau" "3000-3999" "Buch_C")
("<18" "w" "nein" "0" "keiner" "Hausfrau" "2000-2999" "Buch_A")
("36-49" "m" "ja" "2" "Hochschule" "Selbstaendig" "2000-2999" "Buch_C")
("<18" "m" "nein" "0" "Realschule" "Angestellter" "1000-1999" "Buch_C")
("36-49" "m" "nein" "0" "keiner" "Angestellter" "1000-1999" "Buch_A")
("36-49" "w" "nein" "0" "Hochschule" "Selbstaendig" "5000 und mehr" "Buch_C")
("19-24" "w" "nein" "0" "keiner" "Selbstaendig" "3000-3999" "Buch_B")
("50-65" "m" "nein" "0" "Hochschule" "Rentner" "2000-2999" "Buch_C")
("<18" "m" "nein" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("19-24" "w" "nein" "0" "keiner" "Hausfrau" "4000-4999" "Buch_B")
("25-35" "m" "nein" "0" "keiner" "Arbeiter" "2000-2999" "Buch_A")
("25-35" "w" "nein" "0" "Hochschule" "Selbstaendig" "2000-2999" "Buch_C")
("25-35" "w" "nein" "1" "keiner" "Hausfrau" "4000-4999" "Buch_C")
("25-35" "w" "nein" "0" "Realschule" "Angestellter" "2000-2999" "Buch_C")
("36-49" "m" "ja" "1" "Hochschule" "Fuehrungskraft" "5000 und mehr" "Buch_C")
("36-49" "m" "nein" "1" "Hauptschule" "Angestellter" "3000-3999" "Buch_C")
("25-35" "m" "nein" "0" "Hochschule" "Selbstaendig" "3000-3999" "Buch_C")
("25-35" "m" "nein" "1" "Hochschule" "Lehrer" "2000-2999" "Buch_C")
("19-24" "w" "nein" "0" "Hauptschule" "Angestellter" "2000-2999" "Buch_B")
("25-35" "w" "ja" "1" "Hochschule" "Lehrer" "2000-2999" "Buch_C")
("25-35" "m" "ja" "3" "Promotion" "Fuehrungskraft" "5000 und mehr" "Buch_C")
("25-35" "w" "ja" "0" "Hochschule" "Hausfrau" "3000-3999" "Buch_C")
("19-24" "w" "nein" "0" "keiner" "Angestellter" "3000-3999" "Buch_B")
("<18" "m" "ja" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("36-49" "w" "ja" "3" "keiner" "Angestellter" "2000-2999" "Buch_A")
("<18" "w" "ja" "0" "Realschule" "Angestellter" "2000-2999" "Buch_B")
("19-24" "m" "nein" "0" "keiner" "Arbeiter" "1000-1999" "Buch_A")
("<18" "m" "nein" "0" "keiner" "Angestellter" "3000-3999" "Buch_C")
("36-49" "m" "nein" "1" "Hauptschule" "Angestellter" "2000-2999" "Buch_C")
("19-24" "w" "nein" "0" "keiner" "Hausfrau" "2000-2999" "Buch_A")
("19-24" "w" "nein" "0" "Hauptschule" "Hausfrau" "1000-1999" "Buch_B")
("19-24" "w" "nein" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_B")
("19-24" "w" "nein" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_B")
(">65" "w" "ja" "1" "Hochschule" "Rentner" "2000-2999" "Buch_C")
("36-49" "w" "nein" "0" "keiner" "Hausfrau" "<1000" "Buch_A")
("36-49" "w" "nein" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_C")
("19-24" "m" "nein" "0" "Realschule" "Arbeitslos" "2000-2999" "Buch_C")
("25-35" "m" "nein" "1" "keiner" "Arbeitslos" "3000-3999" "Buch_C")
("50-65" "m" "ja" "2" "Realschule" "Arbeiter" "2000-2999" "Buch_C")
("19-24" "w" "ja" "0" "Gymnasium" "Hausfrau" "3000-3999" "Buch_B")
("36-49" "w" "ja" "0" "Hochschule" "Angestellter" "2000-2999" "Buch_C")
100 changes: 100 additions & 0 deletions lisp/test.txt
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,100 @@
("19-24" "m" "nein" "0" "keiner" "Angestellter" "3000-3999" "Buch_C")
("25-35" "m" "nein" "1" "Realschule" "Arbeitslos" "1000-1999" "Buch_C")
("36-49" "m" "nein" "0" "Hochschule" "Angestellter" "3000-3999" "Buch_C")
("25-35" "m" "ja" "1" "Hochschule" "Fuehrungskraft" "5000 und mehr" "Buch_C")
("36-49" "w" "nein" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_C")
("<18" "w" "nein" "0" "keiner" "Hausfrau" "2000-2999" "Buch_A")
("19-24" "w" "ja" "1" "Hauptschule" "Arbeitslos" "1000-1999" "Buch_B")
("25-35" "w" "ja" "1" "Hochschule" "Arbeitslos" "<1000" "Buch_C")
("<18" "w" "nein" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("19-24" "w" "nein" "0" "keiner" "Selbstaendig" "1000-1999" "Buch_A")
("50-65" "m" "nein" "0" "Promotion" "Fuehrungskraft" "5000 und mehr" "Buch_C")
("<18" "m" "nein" "0" "Realschule" "Angestellter" "3000-3999" "Buch_C")
("<18" "w" "ja" "1" "keiner" "Arbeitslos" "<1000" "Buch_A")
("36-49" "m" "nein" "0" "Hochschule" "Angestellter" "2000-2999" "Buch_C")
("36-49" "w" "ja" "2" "Hochschule" "Arbeiter" "1000-1999" "Buch_C")
("36-49" "w" "ja" "0" "Realschule" "Angestellter" "1000-1999" "Buch_C")
("36-49" "w" "nein" "0" "Hochschule" "Hausfrau" "3000-3999" "Buch_C")
("25-35" "m" "nein" "1" "Hochschule" "Angestellter" "3000-3999" "Buch_C")
("50-65" "m" "nein" "0" "keiner" "Rentner" "1000-1999" "Buch_A")
("50-65" "w" "nein" "1" "Hochschule" "Angestellter" "2000-2999" "Buch_C")
("25-35" "m" "nein" "1" "Gymnasium" "Selbstaendig" "5000 und mehr" "Buch_C")
("19-24" "m" "ja" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_C")
("25-35" "w" "ja" "4" "Hochschule" "Hausfrau" "2000-2999" "Buch_C")
("36-49" "w" "ja" "1" "keiner" "Angestellter" "2000-2999" "Buch_A")
("50-65" "m" "ja" "2" "Hauptschule" "Angestellter" "2000-2999" "Buch_C")
("19-24" "m" "nein" "0" "Gymnasium" "Angestellter" "3000-3999" "Buch_C")
("36-49" "m" "ja" "0" "Hochschule" "Angestellter" "2000-2999" "Buch_C")
("36-49" "w" "ja" "2" "keiner" "Arbeiter" "1000-1999" "Buch_A")
("25-35" "m" "nein" "0" "Hochschule" "Arbeitslos" "<1000" "Buch_C")
("50-65" "w" "nein" "0" "Promotion" "Hausfrau" "3000-3999" "Buch_C")
("<18" "w" "nein" "0" "keiner" "Hausfrau" "2000-2999" "Buch_A")
("36-49" "m" "ja" "2" "Hochschule" "Selbstaendig" "2000-2999" "Buch_C")
("<18" "m" "nein" "0" "Realschule" "Angestellter" "1000-1999" "Buch_C")
("36-49" "m" "nein" "0" "keiner" "Angestellter" "1000-1999" "Buch_A")
("36-49" "w" "nein" "0" "Hochschule" "Selbstaendig" "5000 und mehr" "Buch_C")
("19-24" "w" "nein" "0" "keiner" "Selbstaendig" "3000-3999" "Buch_B")
("50-65" "m" "nein" "0" "Hochschule" "Rentner" "2000-2999" "Buch_C")
("<18" "m" "nein" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("19-24" "w" "nein" "0" "keiner" "Hausfrau" "4000-4999" "Buch_B")
("25-35" "m" "nein" "0" "keiner" "Arbeiter" "2000-2999" "Buch_A")
("25-35" "w" "nein" "0" "Hochschule" "Selbstaendig" "2000-2999" "Buch_C")
("25-35" "w" "nein" "1" "keiner" "Hausfrau" "4000-4999" "Buch_C")
("25-35" "w" "nein" "0" "Realschule" "Angestellter" "2000-2999" "Buch_C")
("36-49" "m" "ja" "1" "Hochschule" "Fuehrungskraft" "5000 und mehr" "Buch_C")
("36-49" "m" "nein" "1" "Hauptschule" "Angestellter" "3000-3999" "Buch_C")
("25-35" "m" "nein" "0" "Hochschule" "Selbstaendig" "3000-3999" "Buch_C")
("25-35" "m" "nein" "1" "Hochschule" "Lehrer" "2000-2999" "Buch_C")
("19-24" "w" "nein" "0" "Hauptschule" "Angestellter" "2000-2999" "Buch_B")
("25-35" "w" "ja" "1" "Hochschule" "Lehrer" "2000-2999" "Buch_C")
("25-35" "m" "ja" "3" "Promotion" "Fuehrungskraft" "5000 und mehr" "Buch_C")
("25-35" "w" "ja" "0" "Hochschule" "Hausfrau" "3000-3999" "Buch_C")
("19-24" "w" "nein" "0" "keiner" "Angestellter" "3000-3999" "Buch_B")
("<18" "m" "ja" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("36-49" "w" "ja" "3" "keiner" "Angestellter" "2000-2999" "Buch_A")
("<18" "w" "ja" "0" "Realschule" "Angestellter" "2000-2999" "Buch_B")
("19-24" "m" "nein" "0" "keiner" "Arbeiter" "1000-1999" "Buch_A")
("<18" "m" "nein" "0" "keiner" "Angestellter" "3000-3999" "Buch_C")
("36-49" "m" "nein" "1" "Hauptschule" "Angestellter" "2000-2999" "Buch_C")
("19-24" "w" "nein" "0" "keiner" "Hausfrau" "2000-2999" "Buch_A")
("19-24" "w" "nein" "0" "Hauptschule" "Hausfrau" "1000-1999" "Buch_B")
("19-24" "w" "nein" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_B")
("19-24" "w" "nein" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_B")
(">65" "w" "ja" "1" "Hochschule" "Rentner" "2000-2999" "Buch_C")
("36-49" "w" "nein" "0" "keiner" "Hausfrau" "<1000" "Buch_A")
("36-49" "w" "nein" "0" "Gymnasium" "Angestellter" "2000-2999" "Buch_C")
("19-24" "m" "nein" "0" "Realschule" "Arbeitslos" "2000-2999" "Buch_C")
("25-35" "m" "nein" "1" "keiner" "Arbeitslos" "3000-3999" "Buch_C")
("50-65" "m" "ja" "2" "Realschule" "Arbeiter" "2000-2999" "Buch_C")
("19-24" "w" "ja" "0" "Gymnasium" "Hausfrau" "3000-3999" "Buch_B")
("36-49" "w" "ja" "0" "Hochschule" "Angestellter" "2000-2999" "Buch_C")
("50-65" "w" "nein" "0" "Realschule" "Angestellter" "1000-1999" "Buch_C")
("50-65" "m" "nein" "0" "Realschule" "Arbeitslos" "1000-1999" "Buch_C")
("36-49" "m" "nein" "0" "Realschule" "Angestellter" "2000-2999" "Buch_C")
("19-24" "m" "nein" "0" "keiner" "Arbeitslos" "1000-1999" "Buch_A")
("<18" "m" "nein" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("36-49" "m" "ja" "3" "keiner" "Arbeiter" "2000-2999" "Buch_A")
("19-24" "m" "nein" "0" "Realschule" "Arbeiter" "2000-2999" "Buch_C")
("19-24" "m" "nein" "0" "keiner" "Arbeiter" "3000-3999" "Buch_C")
("36-49" "m" "nein" "0" "Realschule" "Arbeitslos" "1000-1999" "Buch_C")
("19-24" "w" "ja" "1" "Gymnasium" "Hausfrau" "2000-2999" "Buch_B")
("19-24" "m" "nein" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("25-35" "m" "nein" "0" "keiner" "Arbeiter" "1000-1999" "Buch_A")
("25-35" "m" "nein" "1" "Hochschule" "Angestellter" "2000-2999" "Buch_C")
("36-49" "m" "nein" "1" "Hochschule" "Fuehrungskraft" "5000 und mehr" "Buch_C")
("19-24" "w" "nein" "0" "keiner" "Angestellter" "1000-1999" "Buch_A")
("19-24" "m" "nein" "0" "keiner" "Arbeiter" "2000-2999" "Buch_A")
("36-49" "m" "nein" "0" "keiner" "Arbeitslos" "1000-1999" "Buch_A")
("<18" "w" "nein" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("36-49" "m" "ja" "3" "keiner" "Selbstaendig" "1000-1999" "Buch_A")
("36-49" "m" "nein" "0" "keiner" "Angestellter" "3000-3999" "Buch_C")
("19-24" "m" "nein" "0" "Gymnasium" "Arbeiter" "2000-2999" "Buch_C")
("19-24" "w" "nein" "0" "keiner" "Angestellter" "2000-2999" "Buch_A")
("<18" "w" "nein" "0" "keiner" "Arbeiter" "1000-1999" "Buch_A")
("<18" "m" "nein" "0" "Realschule" "Arbeiter" "2000-2999" "Buch_C")
("19-24" "m" "nein" "0" "keiner" "Arbeiter" "2000-2999" "Buch_A")
("25-35" "w" "nein" "0" "Realschule" "Angestellter" "2000-2999" "Buch_C")
("19-24" "m" "nein" "1" "Realschule" "Arbeitslos" "1000-1999" "Buch_C")
("50-65" "m" "ja" "1" "keiner" "Arbeiter" "2000-2999" "Buch_A")
("19-24" "m" "nein" "0" "Hochschule" "Angestellter" "3000-3999" "Buch_C")
(">65" "m" "nein" "0" "Realschule" "Rentner" "1000-1999" "Buch_C")
Loading

0 comments on commit 07779df

Please sign in to comment.