gaushe で共分散を計算してみる

数学苦手なワシ。以下のページを参考に共分散を学ぶ https://mathtrain.jp/covariance

;; 国語・数学 の点数セット
(define lst '((50 50) (50 70) (80 60) (70 90) (90 100)))

(define (sum lst)
  (cond
   ((null? lst) 0)
   (#t
     (+ (car lst) (sum (cdr lst)))))

(define (ave lst)
  (/ (sum lst) (length lst)))

(define (first-list lst) (map car lst)) ;; 国語
(define (second-list lst) (map cadr lst)) ;; 数学

(ave (first-list lst)) ;; 国語 ave
(ave (second-list lst)) ;; 数学 ave


;;共分散 計算方法 1
(ave
  (map
    (lambda (item)
      (*
        (- (car item) (ave (first-list lst)))
        (- (cadr item) (ave (second-list lst)))))
    lst))

;;共分散 計算方法2
(-
  (ave
    (map
      (lambda (item)
        (* (car item) (cadr item)))
      lst))
    (* (ave (first-list lst))
      (ave (second-list lst))))

ついでに標準偏差、相関関数も。

;; 共分散
(define (covariance lst)
  (-
    (ave
      (map (lambda (item) (* (car item) (cadr item))) lst))
    (* (ave (map car lst))
       (ave (map cadr lst)))))

;; 標準偏差
(define (standard-dev lst)
  (define ave-lst (ave lst))
  (ave
    (map
      (lambda (x)
        (expt (- x ave-lst) 2)) lst)))


;; 相関関数
(define (correctionFn lst)
  (inexact
    (/
      (covariance lst)
      (* (standard-dev (map car lst))
         (standard-dev (map cadr lst))))))