(defun furthest (tbl row rows) (let ((max -1) out) (dov (one rows (values out max)) (let ((d (dist tbl row one))) (when (> d max) (setf max d out one)))))) (defun dist (tbl v1 v2) (let ((sum 0) (n *zip*) inc) (do-some2 (num1 num2 v1 v2 (table-nums tbl)) (incf sum (expt (- num1 num2) 2)) (incf n)) (do-some2 (sym1 sym2 v1 v2 (table-syms tbl)) (incf sum (if (eq sym1 sym2) 0 1)) (incf n)) (/ (sqrt sum) (sqrt n)))) ;;;;;;; (deftest !dist1 () (test 20706 (length (!distances "data/autos.lisp")))) (deftest !dist2 () (test "one: #(? ALFA-ROMERO GAS STD TWO HATCHBACK RWD FRONT 0.23032072 0.4492536 0.43333325 0.38333353 0.5178433 OHCV SIX 0.34339622 MPFI 0.10000007 0.6666667 0.125 0.44166666 0.3469388 0.16666667 0.2631579 0.28255796 1) two: #(0.15183246 VOLKSWAGEN DIESEL TURBO FOUR SEDAN FWD FRONT 0.31195346 0.45671627 0.43333325 0.6583335 0.3223429 OHC FOUR 0.13584906 IDI 0.33571428 0.6333334 1.0 0.083333336 0.14285715 0.6666667 0.68421054 0.108658955 2)" (!dist2-prim))) (defun !dist2-prim () (with-output-to-string (str) (let* ((tbl (data "data/autos.lisp")) (one (svref (table-rows tbl) 1))) (format str "one:~% ~a~%two: ~%~a" (row-cells one) (row-cells (furthest tbl one (table-rows tbl))))))) (deftest !dist3 () (test '((0.0 2 3) (0.57735026 1 3) (0.57735026 1 2) (0.8164966 3 4) (0.8164966 2 4) (1.0 1 4)) (!distances "data/weather0.lisp"))) (deftest !dist4 () (test '((0.16217704 2 3) (0.7111274 2 4) (0.7111274 1 2) (0.8164966 3 4) (0.8164966 1 4) (0.8164966 1 3)) (!distances "data/weather1.lisp"))) (deftest !dist5 () (let* ((tbl (data "data/weather1.lisp")) (one (svref (table-rows tbl) 0))) (test "one: #(SUNNY 1.0 HIGH FALSE NO) two: #(SUNNY 0.0 WET TRUE YES)" (with-output-to-string (s) (format s "one: ~a~%two: ~a" (row-cells one) (row-cells (furthest tbl one (table-rows tbl)))))))) (defun !distances (f) (let* (tmp (tbl (data f)) (all (dovs (x n1 (table-rows tbl) tmp) (dovs (y n2 (table-rows tbl)) (if (< n1 n2) (push (list (dist tbl x y) x y) tmp)))))) (mapcar #'(lambda(row) (list (first row) (row-id (second row)) (row-id (third row)))) (sort all #'< :key #'car))))