Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun square (x) (* x x))
- (defun expect (x p)
- (let ((e 0))
- (mapc #'(lambda (xk pk)
- (setf e (+ e (* xk pk))))
- x p)
- e))
- (defun variance (x p)
- (let ((e (expect x p))
- (e2 (expect (mapcar #'square x) p)))
- (- e2 (square e))))
- (defun sigma (x p) "standard deviation"
- (sqrt (variance x p)))
- (defun transpose (m) "transpose arbitrary MxN 2D list"
- (labels ((first-column-vector (m)
- (if (null m) nil
- (cons (caar m) (first-column-vector (cdr m)))))
- (delete-first-column (m)
- (if (null m) nil
- (cons (cdar m) (delete-first-column (cdr m))))))
- (if (null (car m)) nil
- (cons (first-column-vector m)
- (transpose (delete-first-column m))))))
- (defun marginal-expect (xm pm &key (by :row)) "xm: 1D, pm: 2D"
- (expect xm (mapcar #'(lambda (p) (apply #'+ p))
- (case by (:row pm) (:col (transpose pm))))))
- (defun covariance (pm &key row col) "pm: 2D"
- (labels ((sum2d (m)
- (apply #'+
- (mapcar (lambda (i) (apply #'+ i))
- m)))
- (conv (xm pm)
- (if (null xm) nil
- (cons (mapcar #'* (car xm) (car pm))
- (conv (cdr xm) (cdr pm)))))
- (cartesian (row col)
- (mapcar #'(lambda (ritem)
- (mapcar #'(lambda (citem)
- (* ritem citem))
- col))
- row)))
- (let ((e-rc (sum2d (conv (cartesian row col) pm)))
- (e-r (marginal-expect row pm :by :row))
- (e-c (marginal-expect col pm :by :col)))
- (- e-rc (* e-r e-c)))))
- (defun linear-comb (xs ys &key (comb-method #'+) (mult-method #'*))
- (apply comb-method (mapcar mult-method xs ys)))
- ;; Probability table 작성
- ;; row:0<여행횟수<4, col:0<=소지 카드 수<3 일 때
- (defvar *cards* '(0 1 2))
- (defvar *travs* '(1 2 3))
- (defvar *pt*'((0.32 0.18 0.04)
- (0.12 0.14 0.06)
- (0.01 0.03 0.10)))
- ;; (주변확률분포) 여행횟수의 기댓값 구하기
- (marginal-expect *travs* *pt* :by :row) ;=> 1.6
- ;; 소지 카드 수의 기댓값
- (marginal-expect *cards* *pt* :by :col) ;=> 0.75
- ;; 여행횟수와 카드 수 사이의 공분산 구하기
- (covariance *pt* :row *travs* :col *cards*) ;=> 0.27
- ;; linear combination 할일이 많아서 만듬
- (linear-comb '(0.4 0.3 0.2 0.1) '(10 20 30 40)) ;=> 20 (가중평균)
- (linear-comb '(3 2 1) '(x y z) :comb-method #'list :mult-method #'cons)
- ;;=> ((3 . X) (2 . Y) (1 . Z))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement