One-liners' performance
- To: mathgroup at smc.vnet.net
- Subject: [mg40723] One-liners' performance
- From: Kyriakos Chourdakis <tuxedomoon at yahoo.com>
- Date: Tue, 15 Apr 2003 03:57:58 -0400 (EDT)
- Reply-to: k.chourdakis at qmul.ac.uk
- Sender: owner-wri-mathgroup at wolfram.com
Dear all, Having read the discussion about one-liners, and the suggestions that overall the code is typically faster if such an approach is taken, I decided to alter some of my existing code. The code computes the likelihood for regime switching models. I run some comparisons, and found that the ``one-liner'' code is consistenly slower than the code that loops using Do[]. My first guess is that my understanding of the one-liner code might be wrong, and I would appreciate any feedback. The code is given below: First a sample is generated, and likelihoods are computed. Then, 20 samples are computed. For a sample of 3000, the Do[] version is about 30% faster than the Fold[] one. I apologize for the messy Greeks. K. Quit[]; << "Statistics`NormalDistribution`" (* the parameter vector *) theta = {0.05, 0.05, 0.5, -0.5, 1., 4.}; (* Simulate one regime switching path *) Sample := Module[ {p11 = 1 - theta[[1]], p22 = 1 - theta[[2]]}, StTF = NestList[If[#1, Random[] < p11, Random[] > p22] & , Random[] > 0.5, 3000]; ST = (If[#1, 1, 0] & ) /@ StTF; STm = (If[#1, theta[[3]], theta[[4]]] & ) /@ StTF; STs = (If[#1, theta[[5]], theta[[6]]] & ) /@ StTF; n = Length[ST]; STm + Sqrt[STs]*RandomArray[NormalDistribution[], {n}] - STs/2 ]; (* The original code *) Lh = Function[ {\[CapitalPi], \[Mu], \[Sigma], \[Xi]0, Y}, Module[ {\[Nu], \[Zeta]1, \[Zeta]2, \[Zeta]}, \[Nu] = Dimensions[\[CapitalPi]][[1]]; \[Xi] = Transpose[\[Xi]0]; \[Xi]1 = {}; \[Eta] = Transpose[Table[PDF[NormalDistribution[\[Mu][[i,1]], Sqrt[\[Sigma][[i,1]]]], Y], {i, 1, \[Nu]}]]; Do[ \[Zeta]1 = Flatten[\[Xi][[-1]]]; \[Zeta]2 = \[Eta][[i]]; \[Zeta] = \[Zeta]1*\[Zeta]2; \[Zeta]0 = \[Zeta]/Plus @@ Flatten[\[Zeta]]; \[Xi]1 = {\[Xi]1, \[Zeta]0}; \[Xi] = {\[Xi], {\[Zeta]0} . \[CapitalPi]}, {i, Length[Y]} ]; \[Xi]1 = Partition[Flatten[\[Xi]1], \[Nu]]; \[Xi] = Partition[Flatten[\[Xi]], \[Nu]]; Plus @@ Log[Apply[Plus, Delete[\[Xi], -1]*\[Eta], {1}]] ] ]; (* The one-liner type code *) Lh1L = Function[ {\[CapitalPi], \[Mu], \[Sigma], \[Xi]0, Y}, Module[ {\[Nu], \[Zeta]1, \[Zeta]2, \[Zeta]}, \[Nu] = Dimensions[\[CapitalPi]][[1]]; \[Xi] = Flatten[\[Xi]0]; \[Xi]1 = {}; \[Eta] = Transpose[Table[PDF[NormalDistribution[\[Mu][[i,1]], Sqrt[\[Sigma][[i,1]]]], Y], {i, 1, \[Nu]}]]; xx = Transpose[FoldList[ Module[{Lo, \[Xi]o, \[Zeta]}, {\[Xi]o, Lo} = #1; \[Xi]o = Flatten[{\[Xi]o} . \[CapitalPi]]; \[Zeta] = \[Xi]o*#2; \[Xi]o = Plus @@ \[Zeta]; {\[Zeta]/\[Xi]o, Lo + Log[\[Xi]o]}] & , {\[Xi], 0.}, \[Eta]]]; Ps = xx[[1]]; xx[[2,-1]] ] ]; (* Some wrappers *) ToEst[x_, Y_] := Lh[ {{1 - x[[1]], x[[1]]}, {x[[2]], 1 - x[[2]]}}, {{x[[3]]}, {x[[4]]}}, {{x[[5]]}, {x[[6]]}}, {{x[[2]]/(x[[1]] + x[[2]])}, {x[[1]]/(x[[1]] + x[[2]])}}, Y] ToEst1L[x_, Y_] := Lh1L[ {{1 - x[[1]], x[[1]]}, {x[[2]], 1 - x[[2]]}}, {{x[[3]]}, {x[[4]]}}, {{x[[5]]}, {x[[6]]}}, {{x[[2]]/(x[[1]] + x[[2]])}, {x[[1]]/(x[[1]] + x[[2]])}}, Y] (* 20 simulations *) Do[ Y = Sample; ET = Timing[ToEst[theta, Y]][[1]]; ET1L = Timing[ToEst1L[theta, Y]][[1]]; Print[{ET, ET1L, ET - ET1L}], {20}] __________________________________________________ Yahoo! Plus For a better Internet experience http://www.yahoo.co.uk/btoffer
- Follow-Ups:
- Re: One-liners' performance
- From: Dr Bob <majort@cox-internet.com>
- Re: One-liners' performance