Advertisement
Guest User

Untitled

a guest
Oct 19th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.31 KB | None | 0 0
  1. (defun square (x) (* x x))
  2. (defun expect (x p)
  3.   (let ((e 0))
  4.     (mapc #'(lambda (xk pk)
  5.           (setf e (+ e (* xk pk))))
  6.       x p)
  7.     e))
  8.  
  9. (defun variance (x p)
  10.   (let ((e (expect x p))
  11.     (e2 (expect (mapcar #'square x) p)))
  12.     (- e2 (square e))))
  13.  
  14. (defun sigma (x p) "standard deviation"
  15.   (sqrt (variance x p)))
  16.  
  17. (defun transpose (m) "transpose arbitrary MxN 2D list"
  18.   (labels ((first-column-vector (m)
  19.          (if (null m) nil
  20.          (cons (caar m) (first-column-vector (cdr m)))))
  21.        (delete-first-column (m)
  22.          (if (null m) nil
  23.          (cons (cdar m) (delete-first-column (cdr m))))))
  24.     (if (null (car m)) nil
  25.     (cons (first-column-vector m)
  26.           (transpose (delete-first-column m))))))
  27.  
  28. (defun marginal-expect (xm pm &key (by :row)) "xm: 1D, pm: 2D"
  29.   (expect xm (mapcar #'(lambda (p) (apply #'+ p))
  30.              (case by (:row pm) (:col (transpose pm))))))
  31.  
  32. (defun covariance (pm &key row col) "pm: 2D"
  33.   (labels ((sum2d (m)
  34.          (apply #'+
  35.             (mapcar (lambda (i) (apply #'+ i))
  36.                 m)))
  37.        (conv (xm pm)
  38.          (if (null xm) nil
  39.          (cons (mapcar #'* (car xm) (car pm))
  40.                (conv (cdr xm) (cdr pm)))))
  41.        (cartesian (row col)
  42.          (mapcar #'(lambda (ritem)
  43.              (mapcar #'(lambda (citem)
  44.                      (* ritem citem))
  45.                  col))
  46.              row)))
  47.     (let ((e-rc (sum2d (conv (cartesian row col) pm)))
  48.       (e-r (marginal-expect row pm :by :row))
  49.       (e-c (marginal-expect col pm :by :col)))
  50.       (- e-rc (* e-r e-c)))))
  51.  
  52. (defun linear-comb (xs ys &key (comb-method #'+) (mult-method #'*))
  53.   (apply comb-method (mapcar mult-method xs ys)))
  54.  
  55.  
  56. ;; Probability table 작성
  57. ;; row:0<여행횟수<4, col:0<=소지 카드 수<3 일 때
  58. (defvar *cards* '(0 1 2))
  59. (defvar *travs* '(1 2 3))
  60. (defvar *pt*'((0.32 0.18 0.04)
  61.           (0.12 0.14 0.06)
  62.           (0.01 0.03 0.10)))
  63.  
  64. ;; (주변확률분포) 여행횟수의 기댓값 구하기
  65. (marginal-expect *travs* *pt* :by :row) ;=> 1.6
  66.  
  67. ;; 소지 카드 수의 기댓값
  68. (marginal-expect *cards* *pt* :by :col) ;=> 0.75
  69.  
  70. ;; 여행횟수와 카드 수 사이의 공분산 구하기
  71. (covariance *pt* :row *travs* :col *cards*) ;=> 0.27
  72.  
  73. ;; linear combination 할일이 많아서 만듬
  74. (linear-comb '(0.4 0.3 0.2 0.1) '(10 20 30 40)) ;=> 20 (가중평균)
  75. (linear-comb '(3 2 1) '(x y z) :comb-method #'list :mult-method #'cons)
  76. ;;=> ((3 . X) (2 . Y) (1 . Z))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement