最小二乗法

最小二乗法を書いてみた.だんだん前置記法に慣れてきた.頭の中に構文木ができてきている予感.とりあえずはmapcar, applyの便利さに感動.今までPerl高階関数を使ってこなかったことを激しく後悔

(defun least-squares (lis)
  (let
      ((sum_x (apply '+ (mapcar 'car lis)))
       (sum_y (apply '+ (mapcar 'cadr lis)))
       (sum_xy (apply '+ (mapcar '(lambda (x)
				   (* (car x) (cadr x))) lis)))
       (sum_x2 (apply '+ (mapcar '(lambda (x)
				   (* (car x) (car x))) lis))))
    (list
     ; a
     (/
      (- (* (length lis) sum_xy)
	 (* sum_x sum_y))
      (- (* (length lis) sum_x2)
	 (* sum_x sum_x)))

     ; b
     (/
      (- (* sum_x2 sum_y)
	 (* sum_xy sum_x))
      (- (* (length lis) sum_x2)
	 (* sum_x sum_x))))))

(least-squares '((4 -17) (15 -4) (30 -7) (100 50)))
(15370/22363 -449536/22363)