PRML revenge #2 LT by (t)yatsuta
-
Upload
yatsuta-toshihisa -
Category
Technology
-
view
864 -
download
1
Transcript of PRML revenge #2 LT by (t)yatsuta
type VarName = String
data Expr = Num Double | Var VarName | Add [Expr] | Mult [Expr] | Minus Expr | Recip Expr | Pow Expr Expr | Exp Expr | Log Expr | Sqrt Expr | Sum VarName [VarName] Expr Expr Expr | Prod VarName [VarName] Expr Expr Expr deriving (Eq, Ord, Show)
Mult [Recip (Sqrt (Mult [Num 2, Var "PI", Var "sigma^2"])), Exp (Minus (Mult [Recip (Mult [Num 2, Var "sigma^2"]), (Pow (Add [Var "x", Minus (Var "mu")] ) (Num 2))]))]
例:ガウス関数
gaussian = Mult [Recip (Sqrt (Mult [Num 2, Var "PI", Var "sigma^2"])), Exp (Minus (Mult [Recip (Mult [Num 2, Var "sigma^2"]), (Pow (Add [Var "x", Minus (Var "mu")] ) (Num 2))]))]
1
22exp−
x−2
22
gaussian = Mult [Recip (Sqrt (Mult [Num 2, Var "PI", Var "sigma^2"])), Exp (Minus (Mult [Recip (Mult [Num 2, Var "sigma^2"]), (Pow (Add [Var "x", Minus (Var "mu")] ) (Num 2))]))]
1
22exp−
x−2
22
gaussian = Mult [Recip (Sqrt (Mult [Num 2, Var "PI", Var "sigma^2"])), Exp (Minus (Mult [Recip (Mult [Num 2, Var "sigma^2"]), (Pow (Add [Var "x", Minus (Var "mu")] ) (Num 2))]))]
1
22exp−
x−2
22
gaussian = Mult [Recip (Sqrt (Mult [Num 2, Var "PI", Var "sigma^2"])), Exp (Minus (Mult [Recip (Mult [Num 2, Var "sigma^2"]), (Pow (Add [Var "x", Minus (Var "mu")] ) (Num 2))]))]
1
22exp−
x−2
22
●expr + 0 = expr●expr * 0 = 0●expr * 1 = expr●Minus expr = -1 * expr●Recip expr = 1/x●その他、逆関数の相殺、約分など
standardGaussian = eval gaussian [("PI", Num 3.141592), ("mu", Num 0), ("sigma^2", Num 1)]
> standardGaussian Mult [Num 0.3989423219002315, Exp (Mult [Num (-0.5), Pow (Var "x") (Num 2.0)])]
> eval standardGaussian [("x", Num 0)]Num 0.3989423219002315
> eval standardGaussian [("x", Num 1)]Num 0.24197074968943716
> eval standardGaussian [("x", Num 2)]Num 5.399097212943975e-2
> dnorm(c(0,1,2))[1] 0.39894228 0.24197072 0.05399097
Rでは…
ddv
fgh…=dfdv
gh…fddv
gh…
deriv' (Mult [expr]) v = deriv' expr vderiv' (Mult (e:exprs)) v = Add [Mult [e, deriv' (Mult exprs) v], Mult [deriv' e v, Mult exprs]]
deriv expr v = simplify (deriv' (simplify expr) v)
式変形(deriv')の前後で式を単純化●変形前はMinus、Recip、Prodなど、微分が定義されていない式を含む可能性●変形後は0の加算乗算、実行されていない数値演算などを含む可能性
> deriv logLikelyhood "mu"Mult [Add [Mult [Num (-1.0),Var "N",Var "mu"],Sum "n" ["x"] (Num 1.0) (Var "N") (Var "x")],Pow (Var "sigma^2") (Num (-1.0))]
−N∑n=1
N
xn1
2
> let dllh = deriv logLikelyhood "mu"> solve dllh (Num 0) "mu"Mult [Pow (Var "N") (Num (-1.0)),Sum "n" ["x"] (Num 1.0) (Var "N") (Var "x")]
N−1∑n=1
N
xn