Hi Ian

Congratulation and thanks for test and analysis!

The result changes from C=90 (correct) in the old ABC to C=89 (incorrect) in 
the new ABC. Also the old ABC result B=41 and the new ABC result B=37 should 
both be B=20. That is bewildering. 


Consider the test data.
   X=:0.2+0.4*133<i.250

Without noise the new ABC reproduces correctly
   ABC X
0.2 0.4 133
Random rounding to one bit per data point

   round=:>[:?0"0
gives fair approximations
   ABC round X
0.148556 0.451145 131
   ABC round X
0.113223 0.51251 124
   ABC round X
0.209905 0.344298 136
   ABC round X
0.189825 0.393188 136
   ABC round X
0.215108 0.418674 134
   ABC round X
0.247703 0.401055 133


(This should be done using 'for.', but I don't know how!)

I expect that FFTW is much faster than SFT for bigger values of N.


The three fourier transform verbs have these characteristics.

1000 transform the H-vectors one at a time ("1)
 
2000 transform the whole H-matrix at once
0100 slow matrix multiplication (+/ . *)

0200 fast matrix multiplication (FFT tricks)
0010 do not normalize the U-matrix
 
0020 normalize the U-matrix
0001 no complex conjugation

0002 complex conjugation 

0022 the transform equals the invers transform


1122 FT, old ABC

2122 SFT, new ABC

1211 FFTW

We need 2222: transform the whole H-matrix at once, use the fast matrix 
multiplication, normalize, and conjugate.


   require 'math/fftw'
|file name error: script
|       0!:0 y[4!:55<'y'
How is it done?

- Bo


>________________________________
> Fra: Ian Clark <earthspo...@gmail.com>
>Til: Programming forum <programming@jsoftware.com> 
>Sendt: 22:22 mandag den 2. juli 2012
>Emne: Re: [Jprogramming] Kalman filter in J?
> 
>Tried out both your old and new ABC in my rig, with your original FT,
>with SFT and with fftw.
>
>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
>
>   NB. Old ABC ...
>
>   timer 'smoutput ABC X' [ FTS=:1        NB. old FT
>98.6649 41.0013 90
>10.1967
>   timer 'smoutput ABC X' [ FTS=:2        NB. new SFT
>98.6649 41.0013 90
>2.20782
>   timer 'smoutput ABC X' [ FTS=:3        NB. fftw (adjusted to be 
>self-inverse)
>98.6649 41.0013 90
>0.0496461
>   timer 'smoutput ABC X' [ FTS=:4        NB. fftw (raw)
>19535.7 8118.25 90
>0.0446591
>
>(fftw means, I understand, "the fastest Fourier transform in the West" :-)
>
>   NB. New "shined up" ABC ...
>
>   timer 'smoutput ABC X' [ FTS=:1
>98.6542 36.7969 89
>5.09876
>   timer 'smoutput ABC X' [ FTS=:2
>98.6542 36.7969 89
>0.0406119
>   timer 'smoutput ABC X' [ FTS=:3
>98.6542 36.7969 89
>0.02442
>   timer 'smoutput ABC X' [ FTS=:4
>19533.5 7285.79 89
>0.022739
>
>The speed gain when using fftw (FTS=3 and 4) is considerable, eg 2.2
>--> 0.05 with the old ABC. There is very little extra gain from using
>fftw "raw", ie without the adjustment to make FT self-inverse. Without
>this adjustment (FTS=4), ABC returns A and B multiplied by unwanted
>factors, but still estimates C to be the same as before.
>
>Even without fftw, the new ABC is much faster, eg 2.2 --> 0.04, even
>when using SFT. In this instance the further improvement from using
>fftw is not all that spectacular, eg 0.04 --> 0.02. All variants seem
>to estimate A and C quite well, but with this instance of X, B is
>overestimated. However it usually gets B closer.
>
>The overhead of using smoutput within timer is small (approx 0.005).
>
>The flag: FTS determines the verb actually called by FT, which I've
>arranged to be called throughout both versions of ABC. In fact FT
>calls ft<n> for FTS=:<n> .
>
>require 'math/fftw'
>ft1=: +/&(+*((%:%~_1&^&+:&(%~(*/])&i.))&#))
>U=: %:%~_1^(%~+:&(*/~)&i.)    NB. unitary mx
>ft2=: ++/ . *U&{:&$
>ft3=: [: + fftw % [: %: #
>ft4=: fftw
>FT=: 3 : '(ft=: 0:`(ft1"1)`ft2`(ft3"1)`(ft4"1) @. FTS) y'
>
>(fftw happens to return the complex conjugate of your SFT, hence '[:
>+' in the defn of ft3.)
>
>Note that ft1, ft3 and ft4 need to be suffixed by "1 to make them
>behave like ft2 when acting on a 2D matrix: y, ie to make them
>transform each row of y independently.
>
>My suspicion so far is that, with fftw, Bo's FT step-detector may well
>out-perform the other statistics-based methods I've tried to date. I
>guess this is because it uses all the available information from X,
>making no use of confidence limits or short sample means (which waste
>information), nor even thresholds for acceptable false positives /
>negatives.
>
>I shall write this up in my "experimental report" in the wiki, plus
>the code to reproduce my results.
>
>Ian
>
>
>
>On Sat, Jun 30, 2012 at 4:59 PM, Bo Jacoby <bojac...@yahoo.dk> wrote:
>> Hi Ian.
>> I shined the program up a bit. Rather than transforming each row I tranform 
>> the whole matrix at once. It is faster, but still slow. The test function 
>> used is rounded down to zero or up to one. Of course it is hard to 
>> reconstruct ABC from a bitvector, but I think it does a reasonable job. 
>> Please set me know how fast is is on your test examples, and if you manage 
>> to replace the Slow Fourier Transform (SFT) by Fast Fourier Transform (FFT).
>> - Bo
>>
>>
>> NB.H  =: Heaviside steps
>>    H  =: i.&<:</i.
>> NB.U  =: Unitary matrix generator
>>    U  =: %:%~_1^(%~+:&(*/~)&i.)
>> NB.SFT=: Slow Fourier Transformation
>>    SFT=: ++/ . *U&{:&$
>> NB.sm =: symmetrize
>>    sm =: [:,"1/}:"1&(,:|."1)
>> NB.RFT=: Real Fourier Transform.
>>    RFT=: 9 o.${.SFT&sm
>> NB.M1 =: zero origin index of the last item before the step
>>    M1 =: [:(i.<./)[:+/"1[:*:[:}.[:(-"1{.)[:}."1[:(%{."1)}."1
>>    M2 =: [:{:"1[:RFT{.,:~([:{:$){.[:{.{:
>>    M3 =: [:(}.,-/){.,:([:%/1&{"1)*1&{
>>    M4 =: M2&M3
>>    M5 =: 3 : 'x,~M4 y{~0,>:x=.M1 y'
>>    M6 =: RFT&(,H&{:&$)
>> NB.ABC=: constant,stepsize,stepposition
>>    ABC=: M5&M6
>>    round=:>[:?0$~$
>>    ABC X=.round 0.2+0.4*33<i.200
>> 0.264787 0.273477 31
>>    10 20$X
>> 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 0 0
>> 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 1 1 1 0 1
>> 1 0 1 1 0 0 1 1 1 0 1 0 1 1 0 1 0 0 1 0
>> 1 0 1 1 1 1 0 0 0 1 0 0 0 1 0 1 0 1 1 1
>> 0 1 1 1 0 0 1 1 0 0 0 1 1 0 1 0 0 1 0 0
>> 0 1 1 0 0 0 1 0 1 0 1 1 1 1 1 0 1 0 0 1
>> 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 0 1 0 1 1
>> 0 0 1 1 0 1 0 0 1 1 0 1 0 1 1 1 1 0 1 1
>> 1 0 1 0 0 0 1 1 0 1 1 0 1 0 0 0 1 0 1 0
>> 0 1 0 1 0 0 1 1 0 0 1 1 1 0 1 1 1 0 0 1
>>
>>
>...snipped
>----------------------------------------------------------------------
>For information about J forums see http://www.jsoftware.com/forums.htm
>
>
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to