Hi Ian.
I'm glad that your test was successful, albeit slow. The important optimization is to replace my slow fourier transform by a fast fourier transform. Your example has 100 items in the time series, and the real transform RT asks the fourier transform FT to perform 98 vector multiplications by a 198*198 complex matrix, (98*198*198)=3841992, which is embarassingly inefficient. The FFT will speed it up by a factor ((%2&^.)198)=26. Another optimization is to incorporate the computation of A and B into the computation of C, rather than starting from scratch after computing C. The choice of index origin for C is a matter of taste. Why would a Hartley transform be faster than the Fast Fourier Transform? It remains to estimate the inaccuracies of A and B. It is the root-mean-square value of the noise vector X-A+B*C<#X. Note that the noise has only (#X)-2 degrees of freedom, because A and B have been estimated, so the root-mean-square is RMS=:(+/%#-2:)&.:*: - Bo >________________________________ > Fra: Ian Clark <earthspo...@gmail.com> >Til: Programming forum <programming@jsoftware.com> >Sendt: 2:41 tirsdag den 26. juni 2012 >Emne: Re: [Jprogramming] Kalman filter in J? > >...I should add that my CC returns 1+(the value of your 'C'). This is >for compatibility with how I generate the step fn, using (the >constant) C. > >On Tue, Jun 26, 2012 at 1:37 AM, Ian Clark <earthspo...@gmail.com> wrote: >> @Bo -Here is your solution running in my test rig... >> >> A= 100 bias constant (popn mean of X before the step) >> B= 20 scaling factor for height of step >> C= 90 epoch of actual occurrence of the Heaviside step >> D= 10 scaling factor for Gaussian noise component (sigma) >> N= 100 number of epochs in time series X >> step detected at: (wait...) >> 90 >> ABC X >> 99.8246 20.0353 90 >> >> ABC takes approx 10 s to run on my iMac. >> CC (--your 'C') takes approx 5 s. >> >> I'm actually quite impressed with how accurately it estimates A, B, C, >> compared with other methods (which don't do A or B). I'm writing up my >> experiments and will post a wiki link. >> >> Whilst I like your symmetrisation idea, might instead using the >> discrete Hartley Transform (which works entirely in the real domain) >> speed things up? >> >> Ian >> >> On Mon, Jun 25, 2012 at 12:00 PM, Bo Jacoby <bojac...@yahoo.dk> wrote: >>> Hi Ian. Here is your solution. >>> >>> ABC=: 3 : 0 >>> c=.C y >>> y=.(0,>:c){RT"1&(,H&#)y >>> y=.y,(%/1{"1 y)*1{y >>> y=.y,(0{y)-2{y >>> y=.y,(#|:y){.{.{:y >>> y=.4 2{{:"1 RT"1 y >>> y,c >>> ) >>> ABC 101 103 100 210 230 200 >>> 101.15 115.101 2 >>> >>> >>> - Bo >>> >>> >>> >>> >>>>________________________________ >>>> Fra: Ian Clark <earthspo...@gmail.com> >>>>Til: Programming forum <programming@jsoftware.com> >>>>Sendt: 6:46 mandag den 25. juni 2012 >>>>Emne: Re: [Jprogramming] Kalman filter in J? >>>> >>>>Interesting approach, Bo. >>>> >>>>Turned my attention to CUSUM (an adaptive filter) which is rather easy >>>>to compute and gives good results, but needs parameters setting "by >>>>eye". I've yet to try a Bayesian approach, which I suspect will be the >>>>most sensitive of all. >>>> >>>>But I did play with your FT, using *:@(10&o.) to plot a power >>>>spectrum. I'm using rather noisier data than your example: my step is >>>>only roughly (sigma) high. Nevertheless with the onset of the step I >>>>can clearly see a high-frequency spike appear at the far end of the >>>>transformed time-series, due to the transformed Heaviside fn. Same >>>>problem as with the CUSUM statistic however: designing a detector >>>>which can be adjusted for false negatives and positives, and doesn't >>>>take too many subsequent samples to detect the step. >>>> >>>>Will try out your C function in my context, and try to tweak it. Your >>>>solution detects when the step happens, solving 1 in my stated >>>>objectives: 1-4. I fear however that I am more interested in 2-4. >>>> >>>> >>>> >>>>On Sun, Jun 24, 2012 at 6:06 PM, Bo Jacoby <bojac...@yahoo.dk> wrote: >>>>> Hi Ian >>>>> The Fourier Transform FT transforms a complex n-vector X into a complex >>>>> n-vector Y.If X is real, then Y is symmetric. And if X is symmetric then >>>>> Y is real. So I think it is a good idea to symmetrize X before taking the >>>>> FT. (This makes a slow program even slower. Optimize later!) >>>>> >>>>> >>>>> NB.sm=: symmetrize >>>>> sm=:[:,}:"1&(,:|.) >>>>> sm i.6 NB. see what I mean >>>>> >>>>> 0 1 2 3 4 5 4 3 2 1 >>>>> NB.RT=: Real Transform. (9 o. removes every trace of complexity) >>>>> RT=:9 o.#{.FT&sm >>>>> NB.H=:Heaviside steps >>>>> H=:i.&<:</i. >>>>> >>>>> NB.C=:Index of the last item before the change >>>>> C=:[:(i.<./)[:+/"1[:*:[:}.[:(-"1{.)[:}."1[:(%{."1)[:}."1[:RT"1],[:H# >>>>> NB.test >>>>> C 101 204 202 200 203 >>>>> 0 >>>>> C 101 104 202 200 203 >>>>> 1 >>>>> C 101 104 102 200 203 >>>>> 2 >>>>> C 101 104 102 100 203 >>>>> 3 >>>>> >>>>> This is not a Kálmán filter, but it solves the problem. >>>>> - Bo >>>>> >>>>> >>>>> >>>>>>________________________________ >>>>>> Fra: Ian Clark <earthspo...@gmail.com> >>>>>>Til: Programming forum <programming@jsoftware.com> >>>>>>Sendt: 3:20 fredag den 22. juni 2012 >>>>>>Emne: Re: [Jprogramming] Kalman filter in J? >>>>>> >>>>>>Thanks, Bo. I'll look at it when I get back, probably over the weekend. >>>>>> >>>>>>Ian >>>>>> >>>>>>On Fri, Jun 22, 2012 at 12:44 AM, Bo Jacoby <bojac...@yahoo.dk> wrote: >>>>>>> Hi Ian. >>>>>>> The following is a tool, but not yet a solution. >>>>>>> >>>>>>> FT is a slow Fourier Transform. When the problem has been solved it is >>>>>>> time to optimize. This FT has the nice property that FT^:_1 is >>>>>>> identical to FT. >>>>>>> >>>>>>> NB.FT =: Fourier Transformation >>>>>>> FT =: +/&(+*((%:%~_1&^&+:&(%~(*/])&i.))&#)) >>>>>>> NB.rd =: round complex number. >>>>>>> rd =: (**|)&.+. >>>>>>> NB.H =: Heaviside step function >>>>>>> H =: (]#0:),-#1: >>>>>>> 10 H 3 >>>>>>> 0 0 0 1 1 1 1 1 1 1 >>>>>>> NB. FT = FT^:_1 >>>>>>> rd FT FT 10 H 3 >>>>>>> 0 0 0 1 1 1 1 1 1 1 >>>>>>> >>>>>>> >>>>>>> NB. For fixed C the values of A and B to minimize +/*:X-A+B*(#X)H C are >>>>>>> found by solving (2{.FT X) = 2{.FT A+B*(#X)H C >>>>>>> >>>>>>> - Bo >>>>>>>>________________________________ >>>>>>>> Fra: Ian Clark <earthspo...@gmail.com> >>>>>>>>Til: Programming forum <programming@jsoftware.com> >>>>>>>>Sendt: 18:15 torsdag den 21. juni 2012 >>>>>>>>Emne: Re: [Jprogramming] Kalman filter in J? >>>>>>>> >>>>>>>>Yes, Bo, that looks like a fair statement of the problem, in terms of >>>>>>>>least-squares minimization. >>>>>>>> >>>>>>>> >>>>>>>>On Thu, Jun 21, 2012 at 4:46 PM, Bo Jacoby <bojac...@yahoo.dk> wrote: >>>>>>>>> Consider the step functions >>>>>>>>> >>>>>>>>> H=:(]#0:),-#1: >>>>>>>>> 10 H 0 >>>>>>>>> 1 1 1 1 1 1 1 1 1 1 >>>>>>>>> 10 H 3 >>>>>>>>> 0 0 0 1 1 1 1 1 1 1 >>>>>>>>> 10 H 10 >>>>>>>>> 0 0 0 0 0 0 0 0 0 0 >>>>>>>>> The problem is to find constants A,B,C to minimize the expression >>>>>>>>> >>>>>>>>> +/*:X-A+B*(#X)H C >>>>>>>>> Right? >>>>>>>>> -Bo >>>>>>>>>>________________________________ >>>>>>>>>> Fra: Ian Clark <earthspo...@gmail.com> >>>>>>>>>>Til: Programming forum <programming@jsoftware.com> >>>>>>>>>>Sendt: 14:34 torsdag den 21. juni 2012 >>>>>>>>>>Emne: Re: [Jprogramming] Kalman filter in J? >>>>>>>>>> >>>>>>>>>>Thanks, Bo and Ric. Yes, I'd tried searching jwiki on "Kalman" and >>>>>>>>>>Pieter's page was the only instance. >>>>>>>>>> >>>>>>>>>>I neglected to mention that in the most general case I can't really be >>>>>>>>>>confident that X1 and X2 have the same distribution function, let >>>>>>>>>>alone the same variance. But looking at it again, I see that under the >>>>>>>>>>restrictions I've placed the problem simplifies immensely to fitting a >>>>>>>>>>step-function H to: X=: K+G+H. If I can just do that, I'll be happy >>>>>>>>>>for now. >>>>>>>>>> >>>>>>>>>>Repeated application of FFT should allow me to subtract the noise >>>>>>>>>>spectrum F(G), or at least see a significant change in the overall >>>>>>>>>>spectrum emerge after point T, and that might handle the more general >>>>>>>>>>cases as well. >>>>>>>>>> >>>>>>>>>>Anyway it's simple-minded enough for me, and worth a try. FFT is, >>>>>>>>>>after all, "fast" :-) >>>>>>>>>> >>>>>>>>>>But won't an even faster transform do the trick, such as (+/X)? On the >>>>>>>>>>above model, X performs a drunkard's walk around a value M1 until some >>>>>>>>>>point T, after which it walks around M2. Solution: simply estimate M1 >>>>>>>>>>and M2 on an ongoing basis. >>>>>>>>>> >>>>>>>>>>I get the feeling I ought to be searching on terms like "edge >>>>>>>>>>detection", "step detection" and CUSUM. >>>>>>>>>> >>>>>>>>>>Anyway, there's enough here to try. >>>>>>>>>> >>>>>>>>>>On Thu, Jun 21, 2012 at 10:28 AM, Ric Sherlock <tikk...@gmail.com> >>>>>>>>>>wrote: >>>>>>>>>>> Hi Ian, >>>>>>>>>>> >>>>>>>>>>> A quick search of the J wiki finds this: >>>>>>>>>>> http://www.jsoftware.com/jwiki/Stories/PietdeJong >>>>>>>>>>> Sounds like he might have what you're after? >>>>>>>>>>> >>>>>>>>>>> Cheers, >>>>>>>>>>> Ric >>>>>>>>>>> >>>>>>>>>>> On Thu, Jun 21, 2012 at 4:33 PM, Ian Clark <earthspo...@gmail.com> >>>>>>>>>>> wrote: >>>>>>>>>>>> Can anyone help? Has anyone written a Kalman filter in J? >>>>>>>>>>>> >>>>>>>>>>>> I'm not a specialist in either statistics or control theory, so I'm >>>>>>>>>>>> only guessing a Kalman filter is what I need. Though I do have a >>>>>>>>>>>> passing acquaintance with the terms: stochastic control and linear >>>>>>>>>>>> quadratic Gaussian (LQG) control. I am aware that a "Kalman filter" >>>>>>>>>>>> (like ANOVA) is more a topic than a black-box. >>>>>>>>>>>> >>>>>>>>>>>> So let me explain what I want it for. >>>>>>>>>>>> >>>>>>>>>>>> I have a time series X which I am assuming can be modelled like >>>>>>>>>>>> this: >>>>>>>>>>>> >>>>>>>>>>>> X=: K + G + (X1,X2) >>>>>>>>>>>> >>>>>>>>>>>> where >>>>>>>>>>>> >>>>>>>>>>>> K is constant >>>>>>>>>>>> G is Gaussian noise >>>>>>>>>>>> X1 is a random variable with mean: M1 and variance: V1 >>>>>>>>>>>> X2 is a random variable with mean: M2 and variance: V2 >>>>>>>>>>>> >>>>>>>>>>>> Typically X is a sequence of sensor readings, but may also be >>>>>>>>>>>> measurements from a series of user trials conducted on a working >>>>>>>>>>>> prototype, which suffers a design-change at a given point T. >>>>>>>>>>>> >>>>>>>>>>>> Simplifying assumptions (which unfortunately I may need to relax >>>>>>>>>>>> in due course): >>>>>>>>>>>> >>>>>>>>>>>> (a) X is not multivariate >>>>>>>>>>>> (b) X1 and X2 are Gaussian >>>>>>>>>>>> (c) V1=V2 (only the mean value changes, not the variance). >>>>>>>>>>>> >>>>>>>>>>>> The problem: >>>>>>>>>>>> >>>>>>>>>>>> 1. Estimate T=: 1+#X1 -- the point at which X1 gives way to X2. >>>>>>>>>>>> >>>>>>>>>>>> 2. Given T, estimate (M2-M1) -- the "underlying improvement", if >>>>>>>>>>>> any, >>>>>>>>>>>> of the change to the prototype. >>>>>>>>>>>> >>>>>>>>>>>> 3. (subcase of 2.) Given T, test the null hypothesis: M1=M2, viz >>>>>>>>>>>> that >>>>>>>>>>>> there has been no underlying improvement. >>>>>>>>>>>> >>>>>>>>>>>> 4. Estimate U=: #X2 -- the minimum number of samples needed after >>>>>>>>>>>> T in >>>>>>>>>>>> order to achieve 1-3 above with 95% confidence. >>>>>>>>>>>> >>>>>>>>>>>> In other words, detect the signal-in-noise: M1-->M2, and do so in >>>>>>>>>>>> real-time. >>>>>>>>>>>> >>>>>>>>>>>> Because of 4, the need to estimate T and (M2-M1) on an ongoing >>>>>>>>>>>> basis, >>>>>>>>>>>> I can't do a randomised block design. I gather that a Kalman >>>>>>>>>>>> filter, >>>>>>>>>>>> or some sort of adaptive filter, will handle this problem. >>>>>>>>>>>> >>>>>>>>>>>> But maybe something simpler will turn out good enough? >>>>>>>>>>>> >>>>>>>>>>>> Supposing I can get hold of a "black box" Kalman filter, I propose >>>>>>>>>>>> to >>>>>>>>>>>> test it out on generated data and compare its performance to some >>>>>>>>>>>> simple-minded approach, like estimating M1 / M2 from a simple >>>>>>>>>>>> moving >>>>>>>>>>>> average of the last U samples, or applying the F-test to 2 sets of >>>>>>>>>>>> U >>>>>>>>>>>> samples taken either side of T. >>>>>>>>>>>> >>>>>>>>>>>> But since the technique aims to be published, or at least >>>>>>>>>>>> critically >>>>>>>>>>>> scrutinised (and maybe incorporated in a software product), I'd >>>>>>>>>>>> rather >>>>>>>>>>>> depend on a state-of-art packaged solution than reinvent the >>>>>>>>>>>> wheel: a >>>>>>>>>>>> large and very well-turned wheel it appears to me. >>>>>>>>>>>> >>>>>>>>>>>> Ian Clark >>>>>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>>>>> For information about J forums see >>>>>>>>>>>> http://www.jsoftware.com/forums.htm >>>>>>>>>>---------------------------------------------------------------------- >>>>>>>>>>For information about J forums see http://www.jsoftware.com/forums.htm >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> ---------------------------------------------------------------------- >>>>>>>>> For information about J forums see http://www.jsoftware.com/forums.htm >>>>>>>>---------------------------------------------------------------------- >>>>>>>>For information about J forums see http://www.jsoftware.com/forums.htm >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> ---------------------------------------------------------------------- >>>>>>> For information about J forums see http://www.jsoftware.com/forums.htm >>>>>>---------------------------------------------------------------------- >>>>>>For information about J forums see http://www.jsoftware.com/forums.htm >>>>>> >>>>>> >>>>>> >>>>> ---------------------------------------------------------------------- >>>>> For information about J forums see http://www.jsoftware.com/forums.htm >>>>---------------------------------------------------------------------- >>>>For information about J forums see http://www.jsoftware.com/forums.htm >>>> >>>> >>>> >>> ---------------------------------------------------------------------- >>> For information about J forums see http://www.jsoftware.com/forums.htm >---------------------------------------------------------------------- >For information about J forums see http://www.jsoftware.com/forums.htm > > > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm