ちょっと遊ぶ

データ点x_1,\cdots,x_nが与えられた時に、f(x)=\sum^n_{i=1}\exp{(-(\frac{x-x_i}{h})^2})を計算するような関数をGaucheとHaskellで作ってみた。

Haskell

Haskellで無名関数のリストができているのに、printできないからできていないものと勘違いしていて無駄に時間を過ごした。

density :: Double -> (Double -> Double -> Double)
gaussian u = exp (- u * u)
density xi = \ x h -> gaussian((x-xi) / h)

xi = [1,2,3,4,5,1,2,3,2,1,3,1,2]
h = 2

main = do print $ map (\x -> sum $ map (\f -> f x h ) $ map density xi) [0,1,2,3,10]

Gauche

そのままだなあ。

(define X '(1 2 3 4 5 1 2 3 2 1 3 1 2))

(define h 2)

(map (lambda (x)
       (fold + 0 (map (lambda (f) (f x)) 
	       (map (lambda (Xi)
		      (lambda (xi) (exp (- (* (/ (- Xi xi) h) (/ (- Xi xi) h)))))) X))))
     '(0 1 2 3 10)
)

R

実はこの問題、Tsukuba.R#4のmimithonの時にid:reposeに出した問題だったのでした。というわけで、id:repose向けにRでの回答も作ってみた。

gaussian <- function(xi,h){
  xi <- xi
  h <- h
  return(function(x){
    exp(-((x-xi)/h)^2)
  })
}

Reduce("+",Map(function(f){f(c(0,1,2,3,10))},mapply(function(xi){gaussian(xi,2)},c(1,2,3,4,5,1,2,3,2,1,3,1,2))))